Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ vector::clear如何在不丢失已分配内存的情况下调用析构函数_C++_Vector - Fatal编程技术网

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:的确如此。谢谢