Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否重复使用对象';在不先销毁的情况下,如何保存?_C++_Memory Management_C++11 - Fatal编程技术网

C++ 是否重复使用对象';在不先销毁的情况下,如何保存?

C++ 是否重复使用对象';在不先销毁的情况下,如何保存?,c++,memory-management,c++11,C++,Memory Management,C++11,给定的非吊舱类型T: auto p = new T(); ::new (p) T(); /* ... */ delete p; 这是UB,对吗 很明显,我没有直接泄漏分配给第一个T的内存(如果它没有间接成员,那么我就不会泄漏任何东西),但它从未被破坏,在我看来,这似乎是一个自发湮灭由有情类猫生物居住的星系的绝佳候选 谢谢,在C++休息室里,“激励”这个问题。 < P> >它取决于。< /P> [C++11:3.8/1]:类型为T的对象的生存期在以下时间结束: 如果T是具有非平凡析构函数(12

给定的非吊舱类型
T

auto p = new T();
::new (p) T();
/* ... */
delete p;
这是UB,对吗

很明显,我没有直接泄漏分配给第一个
T
的内存(如果它没有间接成员,那么我就不会泄漏任何东西),但它从未被破坏,在我看来,这似乎是一个自发湮灭由有情类猫生物居住的星系的绝佳候选

谢谢,在C++休息室里,“激励”这个问题。

< P> >它取决于。< /P>
[C++11:3.8/1]:
类型为
T
的对象的生存期在以下时间结束:

  • 如果
    T
    是具有非平凡析构函数(12.4)的类类型,则析构函数调用将启动,或者
  • 对象占用的存储被重新使用或释放
显然,这是一种重复使用的情况

以及:

[C++11:3.8/4]:
程序可以通过重用对象占用的存储来结束任何对象的生命周期,或者通过显式调用具有非平凡析构函数的类类型的对象的析构函数来结束该对象的生命周期对于具有非平凡析构函数的类类型的对象,在重用或释放该对象占用的存储之前,程序不需要显式调用析构函数但是,如果没有显式调用析构函数,或者如果没有使用删除表达式(5.3.5)释放存储,则不应隐式调用析构函数,并且依赖析构函数产生的副作用的任何程序都具有未定义的行为。

因此,即使对于非POD类型的
T
,如果程序中的任何内容实际上都不依赖于析构函数所做的事情,那么它也是有效的

这是一个有点空灵的精灵,但它确实可能允许你所做的事情


请注意,这种宽大处理并没有延伸到一些更奇怪的案件:

[C++11:3.8/9]
:在具有静态、线程或自动存储持续时间的常量对象所占用的存储位置创建新对象,或者在此类常量对象在其生存期结束之前所占用的存储位置创建新对象,会导致未定义的行为


“显然我没有泄漏任何内存”-
T
本身没有泄漏,但由于对象没有被正确销毁,因此肯定会泄漏对象所拥有的任何资源。@Arne:你的意思是因为“或者如果没有使用删除表达式(5.3.5)来释放存储”会被触发?我承认这并不明显,但我的解释是,这意味着原始对象的存储。然后,在以后的日期释放重复使用的存储不会影响文章。我认为他的意思是“未定义的行为”。@Arne:第一个对象的存储变成了第二个对象的存储(
[C++11:3.8/7]
)。凯西:我认为第一点是有条件的,第二点是普遍适用的。本标准习惯于使用术语“否则”,否则。不过,你的观点是正确的——也许这并不像我希望的那么清楚。@Casey:我认为
3.8/4
的第一句话支持我,它的结构和“any”一词的用法。@Damon:具有相同值的指针现在清楚地指向一个新的、有效的对象。@Damon:
[C++11:3.8/7]:
如果,在对象的生命周期结束后,在重用或释放对象占用的存储之前,将在原始对象占用的存储位置创建一个新对象,一个指向原始对象的指针,一个引用原始对象的引用,或者,原始对象的名称将自动引用新对象,并且,一旦新对象的生命周期开始,可用于操纵新对象[…]简言之:如果且仅当程序不依赖于其销毁的任何副作用时,您可以仅报废第一个对象而不实际销毁它。