gpt4 book ai didi

C++ 堆栈分配对象,显式析构函数调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:57 25 4
gpt4 key购买 nike

我在处理现有库时遇到了析构函数的奇怪用法。堆栈分配的 STL vector 的析构函数被显式调用,在这种情况下可能需要再次使用该对象。这些 vector 对象是 STL vector 类的稍微定制的版本,具有专门的 clear 方法。在析构函数体中存在两个方法调用:clear()_Tidy()

我一直在努力寻找调用此析构函数的充分理由,而不仅仅是 clear 但我不知所措。谁能阐明为什么这可能是个好主意?

最佳答案

clear() 不能保证实际释放 vector 中分​​配的存储; MSVC 实现中的 _Tidy() 实际上会释放该存储空间,因此这可能是作为优化完成的。

这是一件邪恶的事情,但你可以合法地做这件事(没有未定义的行为),只要存储被完全占用所有存储的相同类型的对象(忽略 cv 限定符)重用:

T automatic;
automatic.T::~T();
new (&automatic) T();

C++ 标准的第 3.8.7 节描述了这种使用场景并解释了它的合法性;它甚至包括一个与上述类似的示例。

关于C++ 堆栈分配对象,显式析构函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1638438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com