c++ Vector catch调整内存泄漏大小
C++ Vector catch resize Memory Leak
我试图保存一个充满指针的矢量圆对象。有时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上,您可能会触发内存不足杀手。这不是真正符合标准的行为,但这是您在现实生活中可能遇到的行为。
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存