【编程好习惯】以逆序方式释放分配获得的资源 推荐
2009-12-30 08:25
316 查看
软件的功能似乎都是以资源的管理为主线的,各模块都存在一定数量的资源分配和释放操作。一个模块在分配所需要的资源时,无一例外地存在各资源的分配顺序。图 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行的释放操作只能是在其它的资源都释放完了后才能进行。但将以逆序的方式释放资源作为编成习惯,有助于避免因资源释放顺序不对所造成的问题。另外,这类问题的发生很容易造成程序崩溃。
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行的释放操作只能是在其它的资源都释放完了后才能进行。但将以逆序的方式释放资源作为编成习惯,有助于避免因资源释放顺序不对所造成的问题。另外,这类问题的发生很容易造成程序崩溃。
相关文章推荐
- 国外程序员推荐的免费编程书籍资源
- 三个进程共享四个同类资源,这些资源的分配与释放只能一次一个。已知每一个进程最多需要两个资源,试问,该系统会发生死锁吗?为什么?
- RAII:在类的构造函数中分配资源,在析构函数中释放资源
- 国外程序员推荐的免费编程书籍资源
- 国外程序员推荐的免费编程书籍资源
- 动态分配资源的自动释放 – auto_ptr的实现原理
- 一起谈.NET技术,如何让ASP.NET默认的资源编程方式支持非.ResX资源存储
- 动态分配资源的自动释放 – auto_ptr的实现原理 .
- 我深深感受到了好的习惯对编程的重要性,尤其是在需要自己释放资源的情况下
- [转][VC/MFC]VC资源分配、释放表
- [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
- 一种O(0)的资源分配及释放算法
- C++ 动态分配资源的自动释放 – auto_ptr的实现原理
- 免费编程入门教程资源推荐搜集,分享给想开始学习程序开发的同学[
- android获得图片资源的三种方式
- 国外程序员推荐的免费编程书籍资源
- 警惕利用类的构造和析构函数来做资源分配释放时候,对临时变量的使用
- LTE下行物理层传输机制(6)-下行资源分配方式(Resource Allocation Type)
- 国外程序员推荐的免费编程书籍资源
- NEWBEE软件团队 人员分配情况及分数获得方式