How to check memory allocation failures with new operator?(如何使用 new 运算符检查内存分配失败?)
问题描述
就在最近,我将项目的语言从 C 切换为使用 C++.对于 C,我使用了 malloc,然后我检查 malloc 是否成功,但是对于 C++,我使用new"来分配内存,我想知道您通常如何检查内存分配失败.
Just recently I switched the language of my project to use C++ from C. With C, I used malloc and after that I check if malloc was successful but with C++, I use 'new' to allocate memory and I would like to know how you would normally check the memory allocation failure.
从我的谷歌搜索中,我没有看到如下所示.
From my google search, I saw nothrow like the following.
char *buf = new (nothrow)char[10];
我还看到了以下内容.
try{} catch(bad_alloc&) {}
但是接下来呢?我正在使用一些 chrome 库例程来使用智能指针.
But what about the following? I am using some of chrome library routines to use smart pointers.
例如,我的代码如下.
scoped_array<char> buf(new char[MAX_BUF]);
使用智能指针很棒,但我不确定应该如何检查内存分配是否成功.我需要用 nothrow 或 try/catch 分成两个单独的语句吗?您通常如何在 C++ 中进行这些检查?
It is great to use smart pointers but I am just not sure how I should check if the memory allocation was successful. Do I need to break into two separate statement with nothrow or try/catch? How do you normally do these checks in C++?
任何建议将不胜感激.
推荐答案
好吧,你调用 new 会抛出 bad_alloc
,所以你必须抓住它:
Well, you call new that throws bad_alloc
, so you must catch it:
try
{
scoped_array<char> buf(new char[MAX_BUF]);
...
}
catch(std::bad_alloc&)
{
...
}
或
scoped_array<char> buf(new(nothrow) char[MAX_BUF]);
if(!buf)
{
//allocation failed
}
<小时>
我的回答是指智能指针传播异常.因此,如果您使用普通的 throw new 分配内存,则必须捕获异常.如果您使用 nothrow new 进行分配,那么您必须检查 nullptr
.无论如何,智能指针不会为这个逻辑添加任何东西
What I mean by my answer is that smart pointers propagate exceptions. So if you're allocating memory with ordinary throwing new, you must catch an exception. If you're allocating with a nothrow new, then you must check for nullptr
. In any case, smart pointers don't add anything to this logic
这篇关于如何使用 new 运算符检查内存分配失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使用 new 运算符检查内存分配失败?
基础教程推荐
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 从 std::cin 读取密码 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- Windows Media Foundation 录制音频 2021-01-01