如何正确破坏向量的c ++向量并释放内存

时间:2012-12-03 08:34:46

标签: c++ memory-leaks vector

  

可能重复:
  How to release std::vector if there is no heap memory

c ++ noob here

假设我声明了一个矢量矢量,如:

vector<vector<vector<double> > > phi_x;

使用完毕后,如何销毁它以释放内存?

我已经阅读了其他一些网站,他们建议使用.clear()。根据我的理解,这只删除元素,但不释放矢量容量。我希望矢量完全被遗忘,就像它从未存在过一样。

此外,我目前的矢量应用程序的尺寸为54x54x9,我有大约12个这样的东西。这被认为是愚蠢的大?

7 个答案:

答案 0 :(得分:9)

您无需做任何事情。只是让变量超出范围。

答案 1 :(得分:8)

如果你调用.clear(),内部向量将被完全销毁。但是,最外面的向量可以保留它用于其向量数组(phi_x.size() * sizeof(vector<vector<double> >)字节)的内存。要完全清除它并释放所有内存,请使用空向量进行交换:

phi_x.swap(vector<vector<vector<double> > >());

或者只是让phi_x超出范围。

答案 2 :(得分:3)

  

使用完毕后,如何销毁它以释放内存?

让它超出范围。

  

我当前的矢量应用程序的尺寸为54x54x9,我有大约12个这样的东西。这被认为是愚蠢的大?

这取决于。如果它是用于具有64k内存的嵌入式平台,那么是的,它很大。如果是标准台式机,使用4G + RAM,则可以忽略它。

答案 3 :(得分:1)

您无需执行任何操作,析构函数将正确清理。

如果要在超出范围之前释放内存使用量,则可以在顶层清除。这不会重新分配顶部向量使用的内存,但会删除所有包含的向量,并且会在析构函数中释放它们的内存。

如果我正确计算,那就是大约100万个double类型的元素。假设一台现代PC作为一个并非愚蠢的平台。甚至非常大:)

答案 4 :(得分:0)

如果你的phi_x变量是某个块内的某个局部变量,它将通过在块结束时调用析构函数来销毁它。

如果它是一个全局变量,它会在main结束后失去作用。

答案 5 :(得分:0)

如果你的例子中显示了这个向量,则不需要进行任何额外的清理,析构函数一旦超出范围就会正确释放内存。

只要在退出中声明它的函数或它所在的对象被销毁,就会发生这种情况。

答案 6 :(得分:0)

析构函数将完成清理工作。除了让phi_x超出范围之外,你不必做任何事情。

{
    vector<vector<vector<double> > > phi_x;

    // do stuff with phi_x
}
// phi_x is gone here