异常处理中对象的自动释放

首先,函数中分配的所有资源需要用局部变量来表示是否已分配。比如,对于 malloc 的内存块,就可以用一个初始化为 NULL 的指针来表示是否已分配。

其次,在函数退出时,需要对已分配的局部资源进行释放。有时候需要将资源分配后传到函数外,此时的最佳做法是让使用该资源的最外部程序再加个标记,到最后释放该资源,或者在最外部函数中使用类似 C++ 类的构造与析构函数。

然后,对于“构造”与“析构”函数,把这个过程分成三个函数,分别叫 init、create 和 destroy。init 用于初始化所有成员,包括设置整型变量的初始值和标记该对象还未分配任何资源。create 可以用于分配这个对象要用到的资源,并返回一个布尔型值表示成功与否。destroy 用于销毁所有已分配的资源。当一个使用过的对象需要重建时,只要 destroy 再 init、create 即可。

为了在函数退出时保证释放,需要使用 goto lbl_finally 这样的语句,加上一个 lbl_finally 标签。

正因为函数退出时所有被标记为已分配的资源都会被释放,因此要注意一个临时指针的问题。比如说,有时候需要分配一个资源,但在函数执行完成之前它不一定被加到另一个传入函数的对象中。如果它被加入对象了,则不需要在函数结束时释放它,否则需要释放它。为了达到这个目的,我们使用一个临时指针,初始化为 NULL,它指向新分配的资源。当资源加入对象后,把这个指针再置 NULL,但必须保证加入对象这个操作是不会失败的,否则万一在加入对象的过程中失败,则不知道对象是否真的已加入。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值