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

时间:2009-10-28 16:34:25

标签: c++ stl destructor

在处理现有库时,我遇到了对析构函数的一种奇怪用法。正在调用堆栈分配的stl向量的析构函数,当它可能需要再次使用该对象时。这些矢量对象是stl矢量类的略微定制版本,具有专门的clear方法。在析构函数体中存在两个方法调用:clear()_Tidy()

我一直试图想出一个很好的理由,为什么这个析构函数被调用而不仅仅是clear,但我不知所措。有人说明为什么这可能是一个好主意?

5 个答案:

答案 0 :(得分:9)

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

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

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

C ++标准的第3.8.7节描述了这种使用场景并解释了它是如何合法的;它甚至包括一个类似于上面的例子。

答案 1 :(得分:5)

这个班级可以使用某种placement new方法吗?这是我唯一一次看到正在使用的显式析构函数。

答案 2 :(得分:5)

大矢量?

狂野猜测......当调用clear()时,向量通常被清空,但内存未被释放。这就是为什么有模式

std::vector<T>().swap(vector_to_clear);

清空向量以便重用并清除已分配的内存。

也许原作者不知道这种模式,并试图以这种邪恶的方式摆脱分配的记忆。 (我认为_Tidy释放了分配的内存)

答案 3 :(得分:1)

这绝对不是一个好主意。析构函数开始运行后对对象的任何操作都会产生未定义的行为。

答案 4 :(得分:1)

也许原始编码器关心内存在哪里分配了对象。

然后必须根据this discussion显式调用析构函数。