class box
{
public:
double length;
double breadth;
double height;
~box()
{
cout<<"destructor executed "<<"\n";
}
};
int main(){
box mybox;
mybox.~box();
return 0;
}
Я написал код вышеупомянутым способом. Я ожидаю, что деструктор ~ box () будет вызван только один раз. Но на самом деле индикатор «Деструктор исполнен» был напечатан дважды. Любой намек на то, почему?
Потому что деструктор автоматически вызывается, когда локальный mybox
объект выходит из области видимости. В итоге вы получите два вызова деструктора для одного и того же объекта, что является неопределенным поведением.
Вы вызываете неопределенное поведение позвонив деструктор дважды на местном объекте. Ссылка гласит:
Обратите внимание, что вызов деструктора напрямую для обычного объекта, такого как
как локальная переменная, вызывает неопределенное поведение, когда деструктор
позвонил снова, в конце области.
Оставьте mybox.~box();
заявление.
Он напечатан дважды, потому что он вызывается дважды. Во-первых, вы называете это с 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- Деструктор вызывается автоматически перед закрывающей скобкой основной функции
2- Вы также вызываете это вручную
По двум вышеуказанным причинам у вас есть два вызова деструктора, что приводит к неопределенному поведению.