станд.:: auto_ptr, удалите [] и утечки

Самый простой способ сделать это на сегодняшний день - использовать pnpm, а не npm, и просто набрать:

pnpm update --latest

https://github.com/pnpm. /pnpm/releases/tag/v3.2.0

7
задан Xeningem 29 July 2009 в 07:32
поделиться

2 ответа

Потому что тебе (не) повезло. 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. В моем коде выше

15
ответ дан 6 December 2019 в 10:52
поделиться
s почему позже, когда delete вызывается деструктором auto_ptr вместо delete [] , это не вызывает проблем, поскольку блок памяти фактически был выделен в new » таким образом, и это выделение может быть связано с delete .

Это пример того, что делать нельзя. Компилятор должен решить, заменять ли 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 [] .

3
ответ дан 6 December 2019 в 10:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: