在处理现有库时,我偶然发现了析构函数的奇怪用法.正在调用堆栈分配的stl向量的析构函数,当它可能需要再次使用该对象时.这些矢量对象是stl矢量类的略微定制版本,具有专门的clear方法.在析构函数体中存在两个方法调用:clear(),_ Tidy().
解决方法
clear()不能保证在向量中实际释放分配的存储空间; MSVC实现中的_Tidy()实际上将释放该存储,因此这可能是作为优化完成的.
这是一个邪恶的事情,但你可以合法地做(没有未定义的行为),只要存储被同一类型的对象(忽略cv限定符)重用,它占用了所有的存储:
T automatic; automatic.T::~T(); new (&automatic) T();
C标准的3.8.7节描述了这种使用场景,并解释了它的合法性;它甚至包括一个类似于上面的例子.