2017-10-28 89 views
1
class box 
{ 
public: 
    double length; 
    double breadth; 
    double height; 

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

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

我以上述方式写的代码。我期望析构函数〜box()只会被调用一次。但实际上,“析构函数执行”指标被打印两次。任何暗示为什么?为A C A析构函数的显式呼叫++对象

回答

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 
} 
0

它在你的情况下,叫了两声,因为

1-析构函数只是在右括号之前自动调用主要功能

2 - 你还可以手动调用它

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

+0

形式上,它不被调用两次。这只是未定义的行为。 –

3

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

3

通过在本地对象上调用destructor两次来调用undefined behavior。基准状态:

注意,直接调用析构函数对于一个普通对象,例如 作为局部变量,调用未定义的行为时,析构函数是 再次调用,在范围的端部。

退出mybox.~box();声明。

+0

这对于本地对象意味着什么,除非它是动态分配的,否则我们不应该为它手动调用析构函数,因为它会在函数结束时自动调用? – Jane

+1

@Jane Placement new可能是个例外。 – Ron

相关问题