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

Col*_*lin 6 c++ destructor stl

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

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

Jos*_*osh 9

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

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

T automatic;
automatic.T::~T();
new (&automatic) T();
Run Code Online (Sandbox Code Playgroud)

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


the*_*ill 5

这个类可以使用某种放置新方法吗?这是我唯一一次看到使用显式析构函数的时候.


Rüd*_*nke 5

大矢量?

疯狂的猜测...当clear()被称为向量时,通常会清空但内存未被释放.这就是为什么有这种模式的原因

std::vector<T>().swap(vector_to_clear);
Run Code Online (Sandbox Code Playgroud)

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

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


Gyö*_*sek 2

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