Когда деструкторы C ++ явно вызываются? - PullRequest
4 голосов
/ 21 января 2010

В каких случаях вам нужно явно вызывать деструктор?

Ответы [ 3 ]

9 голосов
/ 21 января 2010

Когда вы используете размещение-новый, это общая причина (единственная причина?):

struct foo {};

void* memoryLocation = ::operator new(sizeof(foo));
foo* f = new (memoryLocation) foo(); // note: not safe, doesn't handle exceptions

// ...

f->~foo();
::operator delete(memoryLocation);

Это в основном присутствует в распределителях (используемых контейнерами), в функциях construct и destroy соответственно.

В противном случае не надо. Распределение стеков будет производиться автоматически, как и при указании delete. (Используйте умные указатели!)

Ну, я полагаю, это делает еще одну причину: когда вам нужно неопределенное поведение. Тогда не стесняйтесь называть это столько раз, сколько хотите ... :)

4 голосов
/ 21 января 2010

Нет. Вам никогда не нужно явно вызывать деструктор (за исключением размещения new ).

(бессовестный C ++ FAQ Lite plug;>)

В расширенном примечании вызов деструкторов является гарантией компилятора - используя new в целевом выделении, вы нарушаете эту гарантию - что, безусловно, опасно. Если вам нужно специальное выделение, обычно лучше написать собственные распределители и / или переопределить new / delete.

Также обратите внимание, что явный вызов деструктора может иметь серьезные осложнения, и не следует делать в любом другом случае, кроме случая, упомянутого выше.

0 голосов
/ 21 января 2010

Деструктор вызывается автоматически для объектов типа автоматического хранения, когда объект покидает область видимости, и деструктор для объектов в куче вызывается, когда для них используется оператор удаления.

...