std::vector::clear
的要点是它在leaving the capacity unchanged时将数组的大小减小为0。向量中包含的对象的析构函数在.clear()
的点处被调用。
我不明白的是如何在不释放对象所在的内存的情况下调用析构函数。是否有一种已知的方法可以用传统的C ++实现这一点?是否有某种低级黑暗魔法完成了这个?
答案 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()
非常相似的事情。