我在处理现有库时遇到了析构函数的奇怪用法。被分配stl向量的栈的析构函数被明确调用,当它的情况下该对象可能需要再次使用。这些矢量对象是具有专门的clear
方法的stl矢量类的稍微定制的版本。在析构函数体中存在两个方法调用:clear()
,_Tidy()
。C++堆栈分配对象,显式析构函数调用
我一直在想为这个析构函数被调用的一个很好的理由,而不仅仅是clear
,但我不知所措。任何人都清楚为什么这可能是一个好主意?
我在处理现有库时遇到了析构函数的奇怪用法。被分配stl向量的栈的析构函数被明确调用,当它的情况下该对象可能需要再次使用。这些矢量对象是具有专门的clear
方法的stl矢量类的稍微定制的版本。在析构函数体中存在两个方法调用:clear()
,_Tidy()
。C++堆栈分配对象,显式析构函数调用
我一直在想为这个析构函数被调用的一个很好的理由,而不仅仅是clear
,但我不知所措。任何人都清楚为什么这可能是一个好主意?
这绝对不是一个好主意。析构函数开始运行后对对象的任何操作都会产生未定义的行为。
也许最初的编码人员关心内存分配对象的位置。
然后必须明确调用析构函数,按照this discussion。
这可能是这种情况,因为讨论是关于堆栈分配向量的。 – 2009-10-28 18:53:14
clear()不保证实际释放向量中分配的存储空间; MSVC实现中的_Tidy()实际上将释放该存储空间,所以这可能是作为优化完成的。
这是一件很糟糕的事情,但只要存储被相同类型的对象(忽略cv-qualifiers)重用存储并合法地存储所有的存储空间,您就可以合法地执行此操作:
T automatic;
automatic.T::~T();
new (&automatic) T();
C++标准的第3.8.7节描述了这种使用场景并解释了它是如何合法的;它甚至包括一个类似于上面的例子。
你能提供一个代码示例,向量dtor的代码示例,以及它如何被调用? – 2009-10-28 16:43:01
_Tidy()做了什么? – Brian 2009-10-28 16:44:18
向我们展示矢量是如何创建的。 – sbi 2009-10-28 17:07:10