c++ Vector catch调整内存泄漏大小

C++ Vector catch resize Memory Leak

本文关键字:泄漏 内存 调整 Vector catch c++      更新时间:2023-10-16

我试图保存一个充满指针的矢量圆对象。有时bad_alloc捕获有效,但有时不起作用,然后我得到错误消息:

这个应用程序请求运行时以一种不寻常的方式终止它。请联系应用程序的支持团队获取更多信息。"

也许向量数组不能分配更多的内存…但是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 Exhaustionn";
}

通过任务管理器监视您的进程内存-您可能会消耗进程允许的所有内存(等待您的起始点和Circle的大小)

如果您在Win32机器上,那么您有~2GB的进程内存空间用于此操作

首先,您如何确定抛出的唯一可能的异常是std::bad_alloc ?我强烈建议在catch (const bad_alloc&)块之后添加catch (...)块,以验证您是正确的。当然,对于catch (...),您将不知道捕获了什么,只知道它不是bad_alloc

第二,如果你以某种方式触发了未定义的行为(比如,通过解引用一个NULL指针),你不一定会得到一个异常;根据语言规则,你不一定会得到任何有意义的行为。

第三,在Linux上,您可能会触发内存不足杀手。这不是真正符合标准的行为,但这是您在现实生活中可能遇到的行为。