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