C ++堆栈分配的对象,明确的析构函数调用(C++ stack allocated object,

2019-09-02 00:18发布

我碰到一个奇怪的使用析构函数来对现有库工作时。 堆栈分配的STL向量的析构函数正在显式调用,当它的情况是该对象可能需要再次使用。 这些矢量对象是STL的vector类的定制版本有一个专门的clear方法。 在析构体存在两种方法调用: clear() _Tidy()

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

Answer 1:

清晰()是不能保证实际释放载体中的分配的存储; _Tidy()在MSVC的实施将真正释放的存储,所以这可能是作为一个做了优化。

这是做一个邪恶的事,但是你可以通过同一类型的对象在法律上做到这一点(没有未定义的行为),只要存储重复使用(忽略CV-预选赛)恰好所有存储的占用:

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

C ++标准的3.8.7节描述了这种场景,并解释它是如何是合法的; 它甚至包括示例是类似于以上。



Answer 2:

难道这个类使用某种安置新方法? 这就是我往往看到在使用显式析构函数的唯一时间。



Answer 3:

大载体?

胡乱猜测......当clear()被称为矢量通常是空的,但内存没有释放。 这就是为什么有模式

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

空重用载体和清除分配的内存。

也许原作者不知道的模式,并试图在这个邪恶的时尚摆脱了分配的内存。 (我觉得_Tidy释放分配的内存)



Answer 4:

这绝对不是一个好主意。 析构函数后,在对象上的任何操作开始运行导致未定义行为。



Answer 5:

也许原来的编码器关心在内存中的对象进行分配。

然后析构函数必须显式调用,按照这个讨论 。



文章来源: C++ stack allocated object, explicit destructor call