class box
{
public:
double length;
double breadth;
double height;
~box()
{
cout<<"destructor executed "<<"\n";
}
};
int main(){
box mybox;
mybox.~box();
return 0;
}
我用上面的方式编写了代码。我希望析构函数~box()只会被调用一次。但实际上,“析构函数执行”指标打印了两次。有什么提示吗?
答案 0 :(得分:4)
因为当本地mybox
对象超出范围时会自动调用析构函数。您最终会对同一个对象进行两次析构函数调用,这是未定义的行为。
答案 1 :(得分:3)
您通过在本地对象上调用undefined behavior两次来调用destructor。参考文献陈述:
注意直接为普通对象调用析构函数,例如 作为局部变量,在析构函数时调用未定义的行为 在范围的最后再次调用。
遗漏mybox.~box();
声明。
答案 2 :(得分:1)
它打印了两次,因为它被调用了两次。首先,您使用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
}
答案 3 :(得分:1)
在你的情况下,它会被调用两次,因为
1-在主函数
的右括号之前自动调用析构函数2-您也在手动调用
由于以上两个原因,您有两个析构函数调用,这会导致未定义的行为。