Явный вызов деструктора для объекта c ++

class box
{
public:
double length;
double breadth;
double height;

~box()
{
cout<<"destructor executed "<<"\n";
}
};

int main(){
box mybox;
mybox.~box();
return 0;
}

Я написал код вышеупомянутым способом. Я ожидаю, что деструктор ~ box () будет вызван только один раз. Но на самом деле индикатор «Деструктор исполнен» был напечатан дважды. Любой намек на то, почему?

1

Решение

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

4

Другие решения

Вы вызываете неопределенное поведение позвонив деструктор дважды на местном объекте. Ссылка гласит:

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

Оставьте mybox.~box(); заявление.

3

Он напечатан дважды, потому что он вызывается дважды. Во-первых, вы называете это с mybox.~box(), Во-вторых, он будет вызываться автоматически, когда mybox выходит за рамки.

Если вы хотите полностью управлять временем жизни mybox, используйте это:

int main() {
alignas(box) char myboxStorage[sizeof(box)]; // allocate storage on stack for mybox
box &mybox = *new(myboxStorage) box; // call constructor
// use mybox here
mybox.~box(); // call destructor
}
1

В вашем случае он вызывается дважды, потому что

1- Деструктор вызывается автоматически перед закрывающей скобкой основной функции

2- Вы также вызываете это вручную

По двум вышеуказанным причинам у вас есть два вызова деструктора, что приводит к неопределенному поведению.

1
По вопросам рекламы [email protected]