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++##智能指针#
全部评论

相关推荐

07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
nus2201602...:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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