显式调用 c++ 对象的析构函数
Explicit call of a destructor for a c++ object
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-您也手动调用它
由于上述两个原因,您有两个析构函数调用,这会导致未定义的行为。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- C++ - 析构函数只是释放内存还是实际删除对象
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 当 T 具有非平凡析构函数时,类类型 T 的对象是否可以常量初始化?
- 编译器是否在由 new 初始化的对象上调用隐式析构函数
- 受保护析构函数对象在堆vs堆栈上的分配