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

时间:2017-10-28 19:34:04

标签: c++ destructor object-lifetime explicit-destructor-call

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

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

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

我用上面的方式编写了代码。我希望析构函数~box()只会被调用一次。但实际上,“析构函数执行”指标打印了两次。有什么提示吗?

4 个答案:

答案 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-您也在手动调用

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