發表文章

目前顯示的是 9月, 2017的文章

RAII 概念(Resource acquisition is initialization)

RAII 概念 RAII(Resource acquisition is initialization)中文即是"資源取得或分配即是在初始化". 看起來有點攏統. 個人的理解是RAII是用於object上的一個寫法. 物件建立的時候, 資源取得的是時候是經由constructor來初始. 結束的時候便透過destructor來釋放. 這樣的好處就是可以確保資源在物件的生命週期內是存在的. 結束的時候就會釋放掉資源. 閉免掉memory leak的問題或因為資源的關係導致程式運作不正常 C++程式範例 底下以[3]的程式作為範例, 如下所示. bad()會造成程式lock住. 而改為RAII的good()方式可以避免掉這問題. std :: mutex m; void bad() { m.lock(); // 直接取的 lock f(); // (1) 當有例外發生(exception), 程式鎖死 if ( ! everything_ok()) return ; // (2) 程式直接返回, 程式鎖死 m.unlock(); // 釋放lock } void good() { // 使用class包住lock. 而這邊不需像上述使用unlock. // 因為object結束會呼叫解構子. 會做unlok std :: lock_guard < std :: mutex > lk(m); f(); // (1) 當例外造成, lock object也會結束 if ( ! everything_ok()) return ; // (2) 程式返回, lock object也會結束 } // 正常結束, lock object也會結束 C結合RAII 因為之前寫C的時候, 每次都會為了malloc()跟free(), 讓程式碼不簡潔或造成編譯問題. (1) 如程式有重複的release資源的code. (2) 透過goto方式集中資源釋放, 但導致在goto之後的變數宣告無法初始數值 #include<stdio.h> #include<stdlib.