C++ vector::clear如何在不丢失已分配内存的情况下调用析构函数
C++ vector::clear如何在不丢失已分配内存的情况下调用析构函数,c++,vector,C++,Vector,std::vector::clear的要点是,它将数组的大小削减为0。向量中包含的对象的析构函数在.clear()点调用 我不明白的是如何调用析构函数而不释放对象所在的内存。有没有已知的方法来实现这一点与传统的C++?是不是有一种级别低得多的黑魔法能做到这一点 我不明白的是如何调用析构函数而不释放对象所在的内存。有没有已知的方法来实现这一点与传统的C++? 析构函数被显式调用。该标准规定(见§23.2.1),容器中的每种类型都要求该表达式格式良好: (&a)->~X() 调用类的
std::vector::clear
的要点是,它将数组的大小削减为0。向量中包含的对象的析构函数在.clear()
点调用
我不明白的是如何调用析构函数而不释放对象所在的内存。有没有已知的方法来实现这一点与传统的C++?是不是有一种级别低得多的黑魔法能做到这一点
我不明白的是如何调用析构函数而不释放对象所在的内存。有没有已知的方法来实现这一点与传统的C++?
析构函数被显式调用。该标准规定(见§23.2.1),容器中的每种类型都要求该表达式格式良好:
(&a)->~X()
调用类的
对象的析构函数
Object.~Class();
std::vector
手动执行此操作
请注意,在手动调用析构函数后,如果对象
具有自动存储持续时间或通过new
分配,然后通过delete
d,则析构函数仍将再次调用,这可能会导致未定义的行为(如双重删除)。显式调用析构函数在这里起作用,因为默认情况下,std::vector
使用placement new在分配的原始存储上构造对象,而不是常规new。std::vector
包含一个能够执行此操作的std::allocator
。具体请参见std::allocator::destroy(T*ptr)
在幕后,std::allocator
将执行(非常类似于)ptr->~T()
相关:@john:的确如此。谢谢