您现在的位置:计算机技术学习网 > 技术中心 > 编程开发 > C >

【编程好习惯】以逆序方式释放分配获得的资源

来源:未知 责任编辑:智问网络 发表时间:2013-09-02 11:57 点击:

软件的功能似乎都是以资源的管理为主线的,各模块都存在一定数量的资源分配和释放操作。一个模块在分配所需要的资源时,无一例外地存在各资源的分配顺序。图 1中的queue_init()函数中,在58、68、72、77和81行分别进行了五次资源分配。当一个队列不再需要时,则需要调用queue_fini()函数释放相关的资源。很重要的一点是,queue_fini()在释放资源时,需要以逆序的方式释放所分配获得的资源。

example.c
00053: int queue_init (queue_t ** _pp_queue, int _size)
00054: {
00055:     pthread_mutexattr_t attr;
00056:     queue_t *queue;
00057:
00058:     queue = (queue_t *) malloc(sizeof(queue_t));
00059:     if (0 == queue) {
00060:         return -1;
00061:     }
00062:     *_pp_queue = queue;
00063:
00064:     memset (queue, 0, sizeof (*queue));
00065:     queue->size_ = _size;
00066:
00067:     pthread_mutexattr_init (&attr);
00068:     if (0 != pthread_mutex_init(&queue->mutex_, &attr)) {
00069:         goto error1;
00070:     }
00071:
00072:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));
00073:     if (0 == queue->messages_) {
00074:         goto error1;
00075:     }
00076:
00077:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_)) {
00078:         goto error2;
00079:     }
00080:
00081:     if (0 != sem_init(&queue->sem_get_, 0, 0)) {
00082:         goto error3;
00083:     }
00084:
00085:     pthread_mutexattr_destroy (&attr);
00086:
00087:     return 0;
00088:
00089: error3:
00090:     sem_destroy (&queue->sem_put_);
00091: error2:
00092:     free (queue->messages_);
00093: error1:
00094:     pthread_mutexattr_destroy (&attr);
00095:     free (queue);
00096:     return -1;
00097: }
00098:
00099: int queue_fini (queue_t ** _pp_queue, int _size)
00100: {
00101:     queue_t *queue = *_pp_queue;
00102:
00103:     if (0 == queue) {
00104:         return -1;
00105:     }
00106:
00107:     sem_destroy (&queue->sem_get_);
00108:     sem_destroy (&queue->sem_put_);
00109:     free (queue->messages_);
00110:     pthread_mutex_destroy (&queue->mutex_);
00111:     free (queue);
00112: }

图1


其实,在很多情形下,资源释放的顺序根本不重要。比如图 1中的107和108行,其顺序就不是很重要。但是109和111行的顺序就非常的重要,而且,111行的释放操作只能是在其它的资源都释放完了后才能进行。但将以逆序的方式释放资源作为编成习惯,有助于避免因资源释放顺序不对所造成的问题。另外,这类问题的发生很容易造成程序崩溃。


本文出自 “至简李云” 博客,请务必保留此出处http://yunli.blog.51cto.com/831344/252369

    发表评论
    请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
    用户名: 验证码:点击我更换图片
    最新评论 更多>>

    推荐热点

    • Glib实例学习(2)双链表
    • C程序员要学C++吗?
    • C++中实现Singleton的正确方法
    • 编程思维训练(一)
    • 【编程好习惯】引入中间变量使程序更易读
    • 在C++中通过模板规避潜在错误
    • 在C++中通过模板去除强制转换
    • 【编程好习惯】减少搜索头文件的目录数
    网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
    Copyright © 2008-2015 计算机技术学习交流网. 版权所有

    豫ICP备11007008号-1