程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 【編程好習慣】以逆序方式釋放分配獲得的資源

【編程好習慣】以逆序方式釋放分配獲得的資源

編輯:關於C語言

軟件的功能似乎都是以資源的管理為主線的,各模塊都存在一定數量的資源分配和釋放操作。一個模塊在分配所需要的資源時,無一例外地存在各資源的分配順序。圖 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved