gpt4 book ai didi

C++ Vector catch resize 内存泄漏

转载 作者:搜寻专家 更新时间:2023-10-31 01:44:19 25 4
gpt4 key购买 nike

我正在尝试保存一个充满指向 Circle 对象的指针的 vector 。有时 bad_alloc catch 起作用,但有时不起作用,然后我收到错误消息:

This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information."

也许 vector 数组无法分配更多内存...但是 bad_alloc 没有捕获到它。

Circle *ptr;
vector<Circle*> ptrarray;

try{
for (long long i = 0; i < 80000000; i++) {
ptr = new Circle(1,i);
ptrarray.push_back(ptr);
}
}catch(bad_alloc &ba){
cout << "Memory Leak" << endl;
}

如果有人能帮助我,那就太好了;)提前致谢

最佳答案

许多操作系统将允许进程请求比它支持的虚拟内存更多的虚拟地址(标称可用内存),假设进程实际上可能不会访问所有页面。众所周知,这使得稀疏数组在此类系统上变得实用。但是,当您访问每个页面时,CPU 会生成一个中断,并且操作系统必须找到物理内存来支持该页面(如果已配置,也会换出到非 RAM 交换磁盘/文件等) - 当所有选项都用完时(或者有时当您的操作系统危险地接近极限,一些保护进程决定杀死一些进程比让已知的关键进程开始失败更好),你可能会像你观察到的那样得到一个错误。最终,在 C++ 级别无法对此进行控制。您可以快速保留和写入所有页面,因此您很可能在完成所有处理之前就失败了,但即便如此,您也可能会在内存严重不足的情况下被终止。


另外,如果按值存储它们,您可以将更多的圆放入内存中。也就是说,如果 sizeof(Circle) > sizeof(Circle*) 并且碎片限制了你,你可能不会这样做,在这种情况下你可以尝试 std::deque。无论如何:

try
{
std::vector<Circle> array;
array.reserve(80000000);
for (long long i = 0; i < 80000000; i++) {
array.emplace_back(1, i);
}
catch (const bad_alloc& ba)
{
std::cerr << "Memory Exhaustion\n";
}

关于C++ Vector catch resize 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23678678/

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