【发布时间】:2012-04-15 19:49:19
【问题描述】:
This answer 引用 C++11 标准 3.8:
如果没有显式调用析构函数,或者如果没有使用删除表达式 (5.3.5) 来释放存储,则不应隐式调用析构函数,并且任何依赖于由析构函数具有未定义的行为。
没有调用析构函数的部分很清楚。现在假设跳过的析构函数有一个副作用,应该会影响程序的行为。
为什么现在程序行为未定义?为什么不跳过副作用(因为没有调用析构函数)并且程序在没有应用副作用的情况下正常运行?
【问题讨论】:
-
有趣的问题。但是为什么有人不想在不再需要对象时调用析构函数呢?
-
如果在这种情况下析构函数执行非平凡的任务例如:关闭资源句柄或将状态设置为有效等,那么不调用的析构函数当然会影响程序并导致未定义的行为。我不明白跳过副作用的理由。
-
@ereOn:单例已被提及为一个用例(但是,这不应该被认为是好的设计)。
-
@ereOn:
std::cout(和一般登录)是您希望它们在程序运行期间一直可用的特殊情况之一。明显的潜在问题是 C++ 对全局变量的初始化和销毁顺序缺乏保证,不调用某些对象的析构函数是缓解 Destruction Order Fiasco 的一种方式。
标签: c++ memory-leaks c++11 destructor undefined-behavior