面试题:new之后是否有必要判空?

旅行   2024-10-19 07:55   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程:《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电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章