C ++:指针元素的向量是否会在销毁时自动释放每个指针所指向的动态内存?

时间:2019-07-05 14:15:57

标签: c++ pointers vector dynamic-memory-allocation

标题是不言自明的-标准向量实现是否负责释放向量中所有指针所指向的动态内存?

4 个答案:

答案 0 :(得分:4)

不。销毁std::vector时,销毁其所有元素(称为其析构函数),然后重新分配对象使用的存储。但是(原始)指针没有析构函数-销毁它不会释放它所指向的对象-它只会销毁用于保存指针本身的存储空间。

如果您有vector个智能指针(std::unique_ptrstd::shared_ptr),那将是另一回事。这些类 do 具有析构函数,并且 do 销毁它们所指向的对象(unique_ptr,总是shared_ptr,如果它是指向所包含对象的最后一个对象对象,否则只会减少其引用计数)。

注意:std::unique_ptr是围绕原始指针的非常薄的包装器,旨在完全优化掉指针。因此,启用优化后,使用它的原始指针开销应为零。因此,与手动执行内存管理相比,它可以为您提供想要的语义,而无需任何开销。

答案 1 :(得分:3)

不,不是。

如果要“自删除”指针,请使用智能指针(std::unique_ptrstd::shared_ptr)或(取决于指针的用途)诸如std::vector,{ {1}}或std::array

答案 2 :(得分:3)

不,不是。容器不负责原始指针的内存管理。如果指针元素是智能指针(RAII:https://fr.wikipedia.org/wiki/Resource_acquisition_is_initialization),则有可能自动取消分配它们的指针元素

您可以看到指针是一个简单的整数。它的值代表一个内存地址。删除向量指针元素后,将释放分配用于存储该地址的字节。因此,指针所指向的内存地址将丢失(不再引用它=内存泄漏)。

容器将永远不会操纵您的实例(释放指针,修改内容)。它只能调用构造函数(指定一个,进行复制,移动...)和析构函数。

答案 3 :(得分:2)

取决于vector所包含的指针,对于像这样的原始指针

std::vector<Something*> 

不,您必须自己进行清理。

另一方面,如果vector包含智能指针,例如std::unique_ptr

std::vector<std::unique_ptr<Something>> 

然后为您进行清理。

长话短说:尝试使用智能指针。