如何正确销毁C++向量的向量并释放内存

13

可能是重复问题:
如果没有堆内存,如何释放std::vector

我是一个c++新手。

假设我声明了一个向量的向量,例如:

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

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

我阅读了其他网站的建议,他们推荐使用.clear()。据我理解,这只会删除元素,而矢量容量并没有被释放。我希望这个矢量完全被遗忘,就好像它从未存在过一样。

另外,我的当前矢量应用具有54x54x9的维度,并且我有大约12个这样的矢量。这是否被认为是非常大的?


但如果这是一个向量的向量的向量,那就是一个非常不同的问题。 - thecoshman
7个回答

12

你不必做任何事情。只需让该变量超出范围即可。


我明白了,但是向量的内存分配会减慢其后跟随的代码运行吗? - Keenan Z
@KeenanZ 不太可能。对你的代码进行分析以查看。无论如何,你可以在每个向量使用周围添加一个嵌套块作用域。 - Joseph Mansfield

10
如果你调用.clear(),内部向量将被完全销毁。然而,最外层的向量可能会保留其数组的内存(phi_x.size() * sizeof(vector<vector<double> >)字节)。为了完全清除并释放所有的内存,请与一个空向量交换:
phi_x.swap(vector<vector<vector<double> > >());

或者简单地让phi_x超出其作用域即可。


明确清除有助于。 - Shravya Boggarapu

4

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

只需让其超出范围即可。

我的当前向量应用具有54x54x9的尺寸,我有大约12个这样的东西。这被认为是非常大吗?

这取决于情况。如果是用于64k内存的嵌入式平台,则是很大的。如果是用于标准桌面PC,拥有4G+ RAM,则可以忽略不计。


3

你不需要做任何事情,析构函数将会妥善清理。

如果你想在作用域结束前释放内存,那么可以在顶层调用clear。这不会重新分配顶层向量使用的内存,但它会删除所有包含的向量,并在其析构函数中释放它们的内存。

如果我计算正确,这大约是一百万个双精度浮点数元素。假设现代PC作为平台,这并不是非常大或者愚蠢的。


1
析构函数将为您完成清理工作。您不需要做任何事情,只需让phi_x超出范围即可。
{
    vector<vector<vector<double> > > phi_x;

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

0
如果你的phi_x变量是某个块内的局部变量,那么它将在该块结束时被销毁,其析构函数将被调用。
如果它是一个全局变量,则会在main函数结束后被销毁。

0
如果按照您的示例展示的这个向量,就不需要进行任何额外的清理工作,内存将会在析构函数在超出范围时被正确释放。
这将会在声明它的函数退出或者它所在的对象被销毁时立即发生。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接