C++ | 智能指针和异常

C++中异常发生时,若开发者定义异常处理程序,程序将会继续运行,但是异常发生后资源有没有正确释放呢。

请阅读下面的代码。

void fuc()
{
    int *p = new int(9); // 动态分配一个新对象
    /*
    程序抛出异常,且在fuc中为被捕获,此时返回上一个调用
    */
    delete p;	//释放内存
}

若异常发生在new与delete之间,且未被函数捕获异常,则资源p将永远不会被释放,造成内存泄漏。

使用智能指针解决这个问题,请阅读下面代码。

void fuc()
{
    shared_ptr<int> p(new int(9)); // 分配一个新对象
    /*
    程序抛出异常,且在fuc中为被捕获,此时返回上一个调用
    */
} // 函数结束后shared_ptr自动释放内存

使用智能指针管理内存,即使fuc发生异常中途退出也能在函数结束后正确的释放内存。

删除器

智能指针在管理动态内存时使用delete来释放资源,当使用智能指针管理非动态内存(如 myclass a)时,我们需要定义删除器函数来代替delete完成对只能指针进行释放操作。

请阅读下面代码。

void fuc()
{
    myclass a;
    shared_ptr<myclass> p(&a, end_fuc);
    // fuc退出时,即使程序发生异常 shared_ptr也能通过调用end_fuc管理对象 
}

定义了删除器的智能指针,其在销毁时不会执行delete,而是调用删除器函数。

#c++##智能指针#
全部评论

相关推荐

01-11 08:47
门头沟学院 Java
choumoduji...:读研的目的就是为了以最快的速度和最低的要求完成“学校”规定的毕业标准,而不是所谓课题组的要求
点赞 评论 收藏
分享
02-01 12:05
复旦大学 Java
腾讯的提前批大概率应该是没有笔试的,但是这个时候有相当部分的同学简历估计都没有准备好,没准备好的同学也不用急,大部分都是3月之后开,这个时候开的绝大多数都是神仙打架,问的东西也比较难,打算投递的同学也多看下计算机网络和操作系统,腾讯对这部分的知识问的比较多。另外多刷下牛客的热门题库,刷题注意刷ACM模式,和牛客的周赛题,腾讯有的部门会从这里面出原题。我是@程序员花海关注我,带你了解更多校招资讯!
程序员花海:还没有来得及准备的同学可以看下学习路线:https://www.nowcoder.com/discuss/824693499982315520?sourceSSR=users算法题:https://www.nowcoder.com/feed/main/detail/20e7a999fa04485b88340a274411ca0d?sourceSSR=users八股文:https://www.nowcoder.com/discuss/833102362771251200?sourceSSR=users简历书写方式:https://www.nowcoder.com/discuss/839907820706205696?sourceSSR=users都是以前在牛客发的文章~
软开人,秋招你打算投哪些...
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务