给定非 POD 类型T
:
auto p = new T();
::new (p) T();
/* ... */
delete p;
这是UB吧?
显然我并没有直接泄漏为其分配的内存T
(如果它没有间接成员,那么我根本不会泄漏任何东西),但它从未被破坏,在我看来,这似乎是自发毁灭由有感知的猫类生物居住的星系的一个很好的候选者。
Thanks to @Xeo https://stackoverflow.com/users/500104/xeo for, um, "inspiring" this question in the C++ Lounge.
这取决于。
[C++11: 3.8/1]:
类型对象的生命周期T
结束时间:
- if
T
是具有非平凡析构函数的类类型 (12.4),析构函数调用开始,或者
-
对象占用的存储被重用或释放.
显然,这是一个重用的例子。
And:
[C++11: 3.8/4]:
程序可以通过重用对象占用的存储来结束任何对象的生命周期或者通过使用非平凡的析构函数显式调用类类型的对象的析构函数。对于具有非平凡析构函数的类类型的对象,程序不需要显式调用析构函数在对象占用的存储被重用或释放之前;但是,如果没有显式调用析构函数或者如果删除表达式(5.3.5) 不用于释放存储,不得隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都具有未定义的行为。
因此,即使对于非 POD 类型T
,这是有效的iff您的程序中没有任何内容实际上依赖于析构函数正在执行的操作。
这有点不切实际,但它确实可能允许您所做的事情。
请注意,这种宽大处理确实not扩展到一些稍微奇怪的情况:
[C++11: 3.8/9]
:在具有静态、线程或自动存储持续时间的 const 对象占用的存储位置创建新对象,或者在此类 const 对象在其生命周期结束之前占用的存储位置创建新对象会导致未定义的行为
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)