C++ 如何从std::vector恢复内存?

C++ 如何从std::vector恢复内存?,c++,memory,stl,vector,C++,Memory,Stl,Vector,可能重复: 当我在一些较大的向量上调用vector::clear时,我在Task Manager/Performance中看不到返回到系统的内存 显然这是因为容器。一旦任务完成,我将不再使用该内存,内存将更好地返回到系统中 有没有一种方法可以确保内存立即返回到系统,而不是在需要将内存返回到系统时,使用类似vector*v/的指针调用delete on v?您可以将向量放入一个块中,如下所示 ...//your code { vector<double> v(10);

可能重复:

当我在一些较大的向量上调用vector::clear时,我在Task Manager/Performance中看不到返回到系统的内存

显然这是因为容器。一旦任务完成,我将不再使用该内存,内存将更好地返回到系统中


有没有一种方法可以确保内存立即返回到系统,而不是在需要将内存返回到系统时,使用类似vector*v/的指针调用delete on v?

您可以将向量放入一个块中,如下所示

...//your code
{
    vector<double> v(10);
    //use it
}
...//your other code

这样,向量v将被销毁,并且在关闭后作用域结束时,内存将自动释放。

您可以将向量放入块中,如下所示

...//your code
{
    vector<double> v(10);
    //use it
}
...//your other code
这样,向量v将被销毁,内存将在作用域结束后自动释放。

C++11引入了收缩到拟合方法,应该这样做。请注意,它不能严格保证工作,但很可能会:

你的_vector.clear; 您的_vector.shrink_to_fit; 如果不能使用C++11功能,则可以使用以下技巧,清除向量并释放它使用的所有内存:

std::vector.swapyour_vector; 也就是说,有可能即使向量将释放它分配的任何内存,分配器也不会将内存返回给操作系统。但至少这个内存可以用于应用程序的其他部分。

C++11引入了一种收缩到拟合的方法,该方法应该可以做到这一点。请注意,它不能严格保证工作,但很可能会:

你的_vector.clear; 您的_vector.shrink_to_fit; 如果不能使用C++11功能,则可以使用以下技巧,清除向量并释放它使用的所有内存:

std::vector.swapyour_vector;
也就是说,有可能即使向量将释放它分配的任何内存,分配器也不会将内存返回给操作系统。但至少该内存可用于应用程序的其他部分。

您可以使用交换技巧:

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

这将创建一个新的空向量,然后用v交换它的内容。然后,v将为空,它所拥有的内存将被释放。

您可以使用交换技巧来完成此操作:

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

这将创建一个新的空向量,然后用v交换它的内容。然后v将为空,它曾经拥有的内存将被释放。

已经问过[C++vector::clear][1][1]:你真的不应该为此使用任务管理器。人们回答的几乎任何问题都只会让向量将其内存释放回内存分配器。您的标准库和操作系统用于何时将未分配内存从进程释放回系统的标准完全是另一回事,因此即使它正常工作,您也不一定能够在任务管理器中看到它。嘿,闭门人,你知道这里提供的答案比链接问题中的好吗?@bobo:如果你怀疑这里的答案更好,我建议你在中建议将这个问题合并到另一个问题中。如果那里的用户同意,可以将其标记为合并。事实上,如果您获得足够的支持,您甚至可以重新打开此文件,并关闭其他文件作为此文件的副本。已经问过[C++vector::clear][1][1]:您真的不应该使用任务管理器进行此操作。人们回答此问题的几乎任何内容都只会让向量将其内存释放回内存分配器。您的标准库和操作系统用于何时将未分配内存从进程释放回系统的标准完全是另一回事,因此即使它正常工作,您也不一定能够在任务管理器中看到它。嘿,闭门人,你知道这里提供的答案比链接问题中的好吗?@bobo:如果你怀疑这里的答案更好,我建议你在中建议将这个问题合并到另一个问题中。如果那里的用户同意,可以将其标记为合并。事实上,如果你得到足够的支持,你甚至可以重新打开这个,关闭其他的,就像这个一样。。向量是一个对象的成员没有办法,长官。。向量是objectgrr的成员。。代表“grrreat回答!”实际上,根据,如果在临时文件周围放置范围块,它实际上应该清除memorygr。。代表“grrreat回答!”实际上,根据,如果你把作用域块放在临时的周围,它实际上应该清除内存