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,而是调用删除器函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DAYH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值