2015-07-27 2 views
4
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 на каждом объекте внутри буфера, зачем у меня есть это?

Я читаю: what-uses-are-there-for-placement-new и он также говорит

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

ответ

9

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

f-> ~Foo(); 

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

delete[] buffer; 
+0

Так что если я использую место размещения, мне нужно вызвать явный деструктор. Но вопрос в том, почему мне нужно сделать это, и даже это имеет значение, если его стек или куча? Ну конечно, если его куча мне нужно вызвать delete, но имеет ли значение вопрос '~ Foo()' мне нужно сделать? – BennX

+0

@BennX: 'f-> ~ Foo()' кажется не-оператором в вашем случае, но если у вас есть 'std :: string' в' Foo', например, это уже не так, и у вас будет утечка. – Jarod42

+2

@BennX Placement новое разделяет выделение от инициализации. По сути, поскольку вы создали объект, используя два шага, для его уничтожения требуются противоположные два шага. 'delete f' может работать на практике, потому что значения указателя совпадают, но это неопределенное поведение: не гарантируется работа. Лучше быть аккуратным и правильным, чем кратким. – Potatoswatter