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

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

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

我按照上面的方式编写了代码。我希望析构函数 ~box() 只会被调用一次。但实际上,“destructor executed”这个指标被打印了两次。关于为什么的任何提示?

4

4 回答 4

4

因为当本地mybox对象超出范围时会自动调用析构函数。你最终会调用同一个对象的两个析构函数,这是未定义的行为。

于 2017-10-28T19:39:47.590 回答
3

您通过在本地对象上调用析构函数两次来调用未定义的行为。参考文献指出:

请注意,直接为普通对象(例如局部变量)调用析构函数会在作用域结束时再次调用析构函数时调用未定义的行为。

省略mybox.~box();声明。

于 2017-10-28T19:44:15.807 回答
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
}
于 2017-10-28T19:38:42.603 回答
1

在您的情况下它被调用两次,因为,

1-析构函数在主函数的右大括号之前自动调用

2-您也在手动调用它

由于上述两个原因,您有两个析构函数调用导致未定义的行为。

于 2017-10-28T19:39:09.237 回答