vector :: clear如何在不丢失已分配内存的情况下调用析构函数

时间:2013-12-05 06:24:25

标签: c++ vector

std::vector::clear的要点是它在leaving the capacity unchanged时将数组的大小减小为0。向量中包含的对象的析构函数在.clear()的点处被调用。

我不明白的是如何在不释放对象所在的内存的情况下调用析构函数。是否有一种已知的方法可以用传统的C ++实现这一点?是否有某种低级黑暗魔法完成了这个?

3 个答案:

答案 0 :(得分:5)

调用类Object

Class的析构函数
Object.~Class();

std::vector手动执行此操作。

请注意,在手动调用析构函数后,如果Object具有自动存储持续时间或通过new然后delete d分配,则仍会再次调用析构函数,可能导致未定义行为(如双删除)。显式调用析构函数在这里工作是因为默认情况下,std::vector使用 placement new 在已分配的原始存储上构建对象,而不是常规 new

答案 1 :(得分:2)

  

我不明白的是如何在不释放对象所在的内存的情况下调用析构函数。是否有一种已知的方法可以用传统的C ++实现这一点?

显式调用析构函数。标准说(根据§23.2.1),要求容器中的每种类型都能使这种表达形式良好:

(&a)->~X()

答案 2 :(得分:0)

std::vector<T>包含std::allocator<T>,可以执行此操作。特别是,请参阅std::allocator::destroy(T* ptr)

在幕后,std::allocator<T>会做(与ptr->~T()非常相似的事情。