显式调用 c++ 对象的析构函数

Explicit call of a destructor for a c++ object

本文关键字:析构函数 对象 c++ 调用      更新时间:2023-10-16
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-您也手动调用它

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