欢迎关注本公众号,专注面试题拆解
分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取 ,免费分享。 欢迎V:fb964919126
new之后是否有必要判空?
这个问题,我记得我十年前上大学的时候,书上写的对于这种情况,是要进行判断是否为空的。所以我在相当长的一段时间是这么用的,现在有时候习惯也还是不自觉的这么用。(工作中你怎么用的,欢迎评论区讨论留言)
实际new 如果失败了会怎么样呢?
C++标准库定义:
如果new操作符无法获得足够的内存来构造请求的对象,它会抛出一个std::bad_alloc异常。
try
{
int* p = new int[10000000000]; // 可能超出内存限制
}
catch (const std::bad_alloc& e)
{
std::cout << "Caught bad_alloc: " << e.what() << std::endl;
}
也可以选择设置不抛出异常,如果启用了nothrow版本的new操作符(即new(nothrow)),那么当内存分配失败时,它将返回nullptr而不是抛出异常。
// 使用 nothrow 版本
int* p_nothrow = new(std::nothrow) int[10000000000];
if (p_nothrow == nullptr)
{
std::cout << "Memory allocation failed with nothrow." << std::endl;
}
else
{
// 正常使用指针
delete[] p_nothrow; // 释放内存
}
C++标准库提供了两种形式的operator new:
抛出异常的形式:
void* operator new(std::size_t size) throw(std::bad_alloc);
当使用这种形式的new操作符时,如果内存分配失败,它会抛出std::bad_alloc异常。
非抛出异常的形式(nothrow版本):
void* operator new(std::size_t size, const std::nothrow_t&) throw();
当使用这种形式的new操作符时,如果内存分配失败,它不会抛出异常,而是返回nullptr。
总结:
1:使用new操作符时:通常情况下,如果内存分配失败,new操作符会抛出std::bad_alloc异常。你可以通过try/catch块来捕获并处理这个异常。
2:使用nothrow版本时:由于内存分配失败不会抛出异常,因此必须检查返回的指针是否为nullptr。
end
CppPlayer
关注,回复【电子书】珍藏CPP电子书资料赠送
精彩文章合集
专题推荐