Нужно ли удалять объект, который был построен с новым и размещения

class Foo{
//some member
    public:
    int bar;
}

int main(){
    char* buffer = new char[100];
    Foo* f = new(buffer)Foo();
//do i have to
    delete f;
//or is 
    delete[] buffer;
//enough
}

Конечно, я должен удалить его, если удаление Foo оказывает существенное влияние на систему, но допустим, что это простой объект хранения, который я помещаю полностью внутри буфера и не имеет деконструктора, который действительно удаляет некоторые другие вещи.

  • Должен ли я удалить объект, который помещается с новым внутри буфера, или это достаточно, чтобы удалить буфер?
  • Если мне нужно вызвать delete для каждого объекта внутри буфера, зачем мне это делать?

Я читаю: что использует для размещения, и он также говорит

Вы не должны освобождать каждый объект, который использует буфер памяти. Вместо этого вы должны удалить [] только оригинальный буфер.

1 ответ

Решение

Правильный способ уничтожить этот объект - явный вызов деструктора:

f-> ~Foo();

Обычно размещение нового используется с памятью в стеке. В данном случае это выделение кучи, поэтому вам нужно освободить буфер, используя форму delete это соответствует new,

delete[] buffer;
Другие вопросы по тегам