Самый простой способ сделать это на сегодняшний день - использовать pnpm, а не npm, и просто набрать:
pnpm update --latest
Потому что тебе (не) повезло. auto_ptr
вызывает delete
, а не delete []
. Это поведение undefined.
Попробуйте сделать что-то подобное и посмотрите, повезет ли вам:
struct Foo
{
char *bar;
Foo(void) : bar(new char[100]) { }
~Foo(void) { delete [] bar; }
}
int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
std::auto_ptr<Foo> buffer(new Foo[sizeBig]);
}
Идея в том, что ваш деструктор для Foo
не будет вызываться.
Причина в том, что что-то вроде этого: Когда вы говорите delete [] p
, реализация delete []
предполагает переход к каждому элементу в массиве, вызов его деструктора, а затем освобождение указанной памяти к по p. Точно так же delete p
предполагает вызов деструктора на p, а затем освобождение памяти.
char
не имеют деструктора, поэтому он просто удалит память, на которую указывает пользователя p. В моем коде выше
Это пример того, что делать нельзя. Компилятор должен решить, заменять ли new [] на new . Использование delete вместо delete [] и наоборот является неопределенным поведением.
См. Зачем вам писать что-то подобное? (намеренно не использовать delete [] в массиве) для обсуждения delete vs delete [] .
s деструктор вместо delete [] не вызывает проблем, поскольку блок памяти фактически был выделен способом new и это выделение может быть связано с delete ].Это пример того, чего нельзя делать. Компилятор должен решить, заменять ли new [] на new . Использование delete вместо delete [] и наоборот является неопределенным поведением.
См. Зачем вам писать что-то подобное? (намеренно не использовать delete [] в массиве) для обсуждения delete vs delete [] .
s деструктор вместо delete [] не вызывает проблем, поскольку блок памяти фактически был выделен способом new и это выделение может быть связано с delete ].Это пример того, чего нельзя делать. Компилятор должен решить, заменять ли new [] на new . Использование delete вместо delete [] и наоборот является неопределенным поведением.
См. Зачем вам писать что-то подобное? (намеренно не использовать delete [] в массиве) для обсуждения delete vs delete [] .
Компилятор должен решить, заменять ли new [] на new . Использование delete вместо delete [] и наоборот является неопределенным поведением.См. Зачем вам писать что-то подобное? (намеренно не использовать delete [] в массиве) для обсуждения delete vs delete [] .
Компилятор должен решить, заменять ли new [] на new . Использование delete вместо delete [] и наоборот является неопределенным поведением.См. Зачем вам писать что-то подобное? (намеренно не использовать delete [] в массиве) для обсуждения delete vs delete [] .