13

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

c++ 菜鸟在这里

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

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

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

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

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

4

7 回答 7

13

你不必做任何事情。只是让变量超出范围。

于 2012-12-03T08:36:38.430 回答
10

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

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

或者干脆phi_x离开范围。

于 2012-12-03T08:37:50.287 回答
4

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

只是让它超出范围。

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

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

于 2012-12-03T08:37:40.650 回答
2

你不需要做任何事情,析构函数会正确清理。

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

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

于 2012-12-03T08:39:22.773 回答
1

析构函数将为您完成清理工作。您无需执行任何操作,只需让 phi_x 超出范围即可。

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

    // do stuff with phi_x
}
// phi_x is gone here
于 2012-12-03T08:38:43.023 回答
0

如果您的phi_x变量是某个块内的某个局部变量,它将通过在块末尾调用其析构函数来销毁。

如果它是一个全局变量,它会在main结束后被销毁。

于 2012-12-03T08:37:30.850 回答
0

如果此向量如您的示例所示,则无需进行任何额外的清理,一旦超出范围,析构函数就会正确释放内存。

这将在它声明的函数退出或它所在的对象被销毁时立即发生。

于 2012-12-03T08:38:15.063 回答