gpt4 book ai didi

c++ - 尝试使用 while 循环取消分配 vector ,任务管理器显示内存使用量正在增加

转载 作者:行者123 更新时间:2023-11-30 01:52:06 26 4
gpt4 key购买 nike

好吧,我正在尝试了解 vector ,我编写了一些代码来取消分配 vector :

while (!myVector.empty())
{
myVector.pop_back();
myVector.shrink_to_fit();
}

我原以为这会起作用,但实际上,它增加了内存使用量,我的程序永远陷入了这个循环。我已经意识到罪魁祸首是 shrink_to_fit 函数,如果我将它从循环中删除并且只在循环完成后调用它,它就会正确地分配内存。但是,当我将 shrink_to_fit 放入循环中时,为什么它不起作用?我在循环中尝试了两个方向,包括:

while (!myVector.empty())
{
myVector.shrink_to_fit();
myVector.pop_back();
}

但这也行不通。此外,在有人这么说之前,我知道这不是删除 vector 的最优雅或最有效的方法。

编辑:尽管我很欣赏答案,但我仍然完全不知道为什么这不仅仅是删除、缩小和重复。我也不知道为什么我的循环会永远循环,当 vector 为空时它应该停止。

编辑:完整来源:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
vector<string> myVector;

cout << "Begin allocation" << endl;
getchar();

while (myVector.size() < 1000000)
{
myVector.push_back("Nothing Here");
}

cout << "Begin de-allocation" << endl;
getchar();

while (!myVector.empty())
{
myVector.pop_back();
myVector.shrink_to_fit();
}

cout << myVector.size() << endl;
getchar();
}

我可能应该说明我的环境,因为 Neil Kirk 说过这不应该导致无限循环:我使用的是 Visual Studio 2013 Express,没有对命令行进行任何更改,我正在运行 Windows 8.1 并且我正在使用 Task管理器监控内存使用情况。另外,上面的源是完整的源,我没有剪掉任何东西。

编辑:好吧,好吧 我因为产生了世界上最低效的算法而受到了相当多的负面关注 :P,但尽管如此,这些答案还是很有帮助的。是的,我知道它效率低下,即使在发布源代码之前也是如此,但首先这是一个实验,其次向 vector 添加大量元素是我检测任务管理器波动的唯一方法。我现在意识到它并不像我最初认为的那样是一个无限循环。复制一百万个左右的元素只需要一段时间。

最佳答案

每次您调用 shr​​ink_to_fit 时,您将近 1000000 个元素 vector 被重新分配,然后每个元素被移动到新版本,然后旧版本被释放。

您在 1000000、999999、999998、999997、999996、999995 等处执行此操作。

这会导致 500000500000 次 std::string 移动和代码收缩部分的 100 万次分配。

请求了 5000 亿次操作,需要一段时间。

如果您不希望代码执行几乎无用的事情五万亿次,请考虑不要shr​​ink_to_fiting,除非它很重要。例如,only shrink_to_fit if size() is less than 2/3 capacity() .

C++ 运行时不会立即将未使用的内存返回给操作系统。当您分配一百万个 block 并再次释放它们时,您最终会得到进程拥有的未使用的内存页面。理想情况下,您会在两个不同的大缓冲区之间进行交换,之前释放的缓冲区将用于下一次分配。

关于c++ - 尝试使用 while 循环取消分配 vector ,任务管理器显示内存使用量正在增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25141240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com