可能重复:
如果没有堆内存,如何释放 std::vector
c++ 菜鸟在这里
假设我声明了一个向量向量,例如:
vector<vector<vector<double> > > phi_x;
用完后如何销毁以释放内存?
我读过其他一些网站,他们建议使用 .clear()。据我了解,这只会删除元素,但不会释放向量容量。我希望向量被完全遗忘,就像它从未存在过一样。
此外,我当前的向量应用程序的尺寸为 54x54x9,我有大约 12 个这样的东西。这被认为是愚蠢的大吗?
可能重复:
如果没有堆内存,如何释放 std::vector
c++ 菜鸟在这里
假设我声明了一个向量向量,例如:
vector<vector<vector<double> > > phi_x;
用完后如何销毁以释放内存?
我读过其他一些网站,他们建议使用 .clear()。据我了解,这只会删除元素,但不会释放向量容量。我希望向量被完全遗忘,就像它从未存在过一样。
此外,我当前的向量应用程序的尺寸为 54x54x9,我有大约 12 个这样的东西。这被认为是愚蠢的大吗?
你不必做任何事情。只是让变量超出范围。
如果您调用.clear()
,内部向量将被完全破坏。但是,最外层的向量可能会保留其用于向量数组(phi_x.size() * sizeof(vector<vector<double> >)
字节)的内存。要完全清除它并释放所有内存,请使用空向量进行交换:
phi_x.swap(vector<vector<vector<double> > >());
或者干脆phi_x
离开范围。
用完后如何销毁以释放内存?
只是让它超出范围。
我当前的向量应用程序的尺寸为 54x54x9,我有大约 12 个这样的东西。这被认为是愚蠢的大吗?
这取决于。如果它是用于具有 64k 内存的嵌入式平台,那么是的,它很大。如果是标准台式机,4G+ RAM,可以忽略。
你不需要做任何事情,析构函数会正确清理。
如果您想在超出范围之前释放内存使用量,那么您可以在顶层调用 clear 。这不会重新分配顶部向量使用的内存,但会删除所有包含的向量,并且它们将在其析构函数中释放它们的内存。
如果我计算正确,那大约是 100 万个 double 类型的元素。假设现代 PC 是一个不那么大的平台。甚至非常大:)
析构函数将为您完成清理工作。您无需执行任何操作,只需让 phi_x 超出范围即可。
{
vector<vector<vector<double> > > phi_x;
// do stuff with phi_x
}
// phi_x is gone here
如果您的phi_x
变量是某个块内的某个局部变量,它将通过在块末尾调用其析构函数来销毁。
如果它是一个全局变量,它会在main
结束后被销毁。
如果此向量如您的示例所示,则无需进行任何额外的清理,一旦超出范围,析构函数就会正确释放内存。
这将在它声明的函数退出或它所在的对象被销毁时立即发生。