标题是不言自明的-标准向量实现是否负责释放向量中所有指针所指向的动态内存?
答案 0 :(得分:4)
不。销毁std::vector
时,销毁其所有元素(称为其析构函数),然后重新分配对象使用的存储。但是(原始)指针没有析构函数-销毁它不会不释放它所指向的对象-它只会销毁用于保存指针本身的存储空间。
如果您有vector
个智能指针(std::unique_ptr
或std::shared_ptr
),那将是另一回事。这些类 do 具有析构函数,并且 do 销毁它们所指向的对象(unique_ptr
,总是shared_ptr
,如果它是指向所包含对象的最后一个对象对象,否则只会减少其引用计数)。
注意:std::unique_ptr
是围绕原始指针的非常薄的包装器,旨在完全优化掉指针。因此,启用优化后,使用它的原始指针开销应为零。因此,与手动执行内存管理相比,它可以为您提供想要的语义,而无需任何开销。
答案 1 :(得分:3)
不,不是。
如果要“自删除”指针,请使用智能指针(std::unique_ptr
或std::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>>
然后为您进行清理。
长话短说:尝试使用智能指针。