我碰到一个奇怪的使用析构函数来对现有库工作时。 堆栈分配的STL向量的析构函数正在显式调用,当它的情况是该对象可能需要再次使用。 这些矢量对象是STL的vector类的定制版本有一个专门的clear
方法。 在析构体存在两种方法调用: clear()
_Tidy()
我一直试图想一个很好的理由,为什么这个析构函数被调用,而不是仅仅clear
,但我不知所措。 任何人能够解释为什么这可能是一个好主意任何轻?
我碰到一个奇怪的使用析构函数来对现有库工作时。 堆栈分配的STL向量的析构函数正在显式调用,当它的情况是该对象可能需要再次使用。 这些矢量对象是STL的vector类的定制版本有一个专门的clear
方法。 在析构体存在两种方法调用: clear()
_Tidy()
我一直试图想一个很好的理由,为什么这个析构函数被调用,而不是仅仅clear
,但我不知所措。 任何人能够解释为什么这可能是一个好主意任何轻?
清晰()是不能保证实际释放载体中的分配的存储; _Tidy()在MSVC的实施将真正释放的存储,所以这可能是作为一个做了优化。
这是做一个邪恶的事,但是你可以通过同一类型的对象在法律上做到这一点(没有未定义的行为),只要存储重复使用(忽略CV-预选赛)恰好所有存储的占用:
T automatic;
automatic.T::~T();
new (&automatic) T();
C ++标准的3.8.7节描述了这种场景,并解释它是如何是合法的; 它甚至包括示例是类似于以上。
难道这个类使用某种安置新方法? 这就是我往往看到在使用显式析构函数的唯一时间。
大载体?
胡乱猜测......当clear()
被称为矢量通常是空的,但内存没有释放。 这就是为什么有模式
std::vector<T>().swap(vector_to_clear);
空重用载体和清除分配的内存。
也许原作者不知道的模式,并试图在这个邪恶的时尚摆脱了分配的内存。 (我觉得_Tidy
释放分配的内存)
这绝对不是一个好主意。 析构函数后,在对象上的任何操作开始运行导致未定义行为。
也许原来的编码器关心在内存中的对象进行分配。
然后析构函数必须显式调用,按照这个讨论 。