C ++ STL矢量向量和内存管理

时间:2014-07-05 12:53:31

标签: c++ c++11 memory-management vector memory-leaks

我们有一个需要创建

的场景
std::vector<std::vector<float>> data;

因为矢量的长度都不相同。

当数据被释放时,数据中的每个向量是否也释放了它的空间?

2 个答案:

答案 0 :(得分:3)

所有标准库类型都适当地实现RAII。也就是说,它们执行的任何类型的内部动态分配将在对象被销毁时自动清理。你永远不必担心它。

对于标准容器,如std::vector,它将自动确保每个元素都被销毁。当然,如果std::vector的元素本身是std::vector s,它们将反过来破坏它们的元素。一切都是自动的。

您可能已经看到过具有std::vector<T*>的示例,然后使用T手动分配new个对象。在此意识到向量的元素不是T对象,而是T*对象,这一点很重要。 指针将自动清除。由于您手动分配了T个对象,因此需要手动取消分配它们。 (正如@Veritas在评论中所说,在这种情况下,你应该更喜欢使用智能指针)

答案 1 :(得分:1)

是 每当“数据”的“范围”结束时,将自动调用析构函数,并释放为“数据”分配的内存。 每当为向量调用析构函数时,就会调用析构函数中的每个元素。

假设向量a(5) 这里将调用[0],[1],......的析构函数。

类似地,在上述情况下,矢量&lt;矢量&gt; X; x [0]的析构函数,x [1]将连续调用..

但是这里每个元素x [i]又是一个向量,所以x [i] [0],x [i] [1] ...的析构函数将被称为..

这样所有元素都会被递归销毁..