程式設計好習慣 以逆序方式釋放分配獲得的資源

2021-09-05 02:07:18 字數 1847 閱讀 1979

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

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))

00071:

00072:     queue->messages_ = (void **) malloc (queue->size_ * sizeof (void *));

00073:     if (0 == queue->messages_)

00076:

00077:     if (0 != sem_init(&queue->sem_put_, 0, queue->size_))

00080:

00081:     if (0 != sem_init(&queue->sem_get_, 0, 0))

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:

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行的釋放操作只能是在其它的資源都釋放完了後才能進行。但將以逆序的方式釋放資源作為編成習慣,有助於避免因資源釋放順序不對所造成的問題。另外,這類問題的發生很容易造成程式崩潰。

程式設計好習慣

我們在編碼的時候總是希望能寫出風格良好,清晰 健壯的程式,把 當成一件藝術品來看待 來雕琢,讓 coding成為一種藝術。看了很多大牛關於程式設計風格與修養方面的文章,很受啟發,結合自己體會,簡錄幾條,提醒自己時刻注意。1.引數檢查 對於有引數的函式,首先要對引數的合法性進行檢查。可以利用asser...

程式設計好習慣

1.dry 不要重複你自己 don t repeat yourself dry是一條最容易理解但又是相對比較難以應用的原則。它是指當你在兩處或者更多的地方發現相似 時,我們應當把它們抽象成乙個新的函式,在之前重複的地方呼叫新的函式並帶上適當的引數。dry也許是最普遍的一條程式設計原則,我從未發現乙個...

C 程式設計好習慣

1.不要在建構函式中做初始化操作 要求類 尤其是對外介面類 提供init 函式,在該函式中進行相關初始化操作,初始化失敗能夠返回錯誤碼。可以規避問題 建構函式中難以返回錯誤碼,外部呼叫者無從判斷初始化結果。當該類作為全域性變數使用時,構造函式呼叫發生在main 函式執行之前,出現問題難以追蹤。2.所...