【问题标题】:C++ STL vector of vectors and memory management向量的 C++ STL 向量和内存管理
【发布时间】:2014-07-05 12:53:31
【问题描述】:

我们有一个场景需要创建一个

std::vector<std::vector<float>> data;

因为向量的长度完全不同。

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

【问题讨论】:

  • 是的。当 std::vector 被析构时,它会调用其每个元素的析构函数。
  • 您认为这样的代码工作并以某种方式引入错误是否明智?什么样的标准库会包含这样的数据结构?您认为您应该如何“解决”这个问题?
  • @KerrekSB:C 标准将,float** array; ... free(array); 不会在 array 中包含的指针上调用 free。
  • @MatthieuM.:这是一个延伸的比较——指针不拥有任何东西。不是float ** array; 需要清理;这是您获取存储在array 中的值的任何操作。

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


【解决方案1】:

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

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

您可能已经看到了一些示例,其中您有一个 std::vector&lt;T*&gt;,然后使用 new 手动分配了 T 对象。这里重要的是要意识到向量的元素不是T 对象,而是T* 对象。 指针 将被自动清理。由于您手动分配了 T 对象,因此您需要手动取消分配它们。 (正如@Veritas 在 cmets 中所说,在这种情况下,您应该更喜欢使用智能指针)

【讨论】:

  • 好答案。为了完整起见,我要补充一点,在这些情况下,使用智能指针是一种很好的做法。
【解决方案2】:

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

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

同样在上述情况下vector x; x[0],x[1] 的析构函数将被连续调用..

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

通过这种方式,所有元素都被递归销毁..

【讨论】:

  • 提问者想知道分配给内部vectors的元素的内存。
  • Scope 是错误的词,即使在引号中也是如此。你的意思是一生。根据我的经验,混淆范围和生命周期是理解内存管理和指针的巨大障碍。
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
相关资源
最近更新 更多