其他分享
首页 > 其他分享> > 为什么不删除在C 11中具有带有副作用未定义行为的析构函数的对象?

为什么不删除在C 11中具有带有副作用未定义行为的析构函数的对象?

作者:互联网

This answer报价C 11标准3.8:

if there is no explicit call to the destructor or if a delete-expression (5.3.5) is not used to release the storage, the destructor shall not be implicitly called and any program that depends on the side effects produced by the destructor has undefined behavior.

关于析构函数未被调用的部分很清楚.现在假设跳过的析构函数具有应该影响程序行为的副作用.

为什么程序行为现在未定义?为什么不跳过副作用(因为没有调用析构函数)并且程序正常运行而没有应用副作用?

解决方法:

重要的部分是该段的第一部分(强调我的):

A program may end the lifetime of any object by reusing the storage which the object occupies

如果只是为没有调用析构函数的对象重用存储,那么就会得到未定义的行为.例如,对象可能已经启动了一个线程,或者已经注册了一个回调,或者一个外部组件可能期望该对象仍然存在的其他操作.

标签:c,c11,destructor,undefined-behavior,memory-leaks
来源: https://codeday.me/bug/20190929/1831314.html