條款17:以獨立語句將newed物件置入智慧指標
阿新 • • 發佈:2018-10-31
條款17:以獨立語句將newed物件置入智慧指標
如何理解這句話呢?先上程式碼
①呼叫GetPriority(1)
②new Queue
③呼叫shared_ptr的建構函式
對於一些編譯器的執行順序可不確定,假如先呼叫②,再呼叫①,最後是③,看起來還是沒問題吧。但是如果在呼叫② 時丟擲異常,那麼new的記憶體就會被遺失,沒有為放到物件資源管理器shared_ptr中,導致記憶體洩露。
那麼該如何去防止這種情況呢?分離語句
①先new建立物件
②把物件放到智慧指標中(可與①合併)
③把智慧指標傳遞到函式呼叫
修改呼叫方式
class Queue
{
public:
Queue() {}
~Queue() {}
};
int GetPriority(const int type) {return 1;}
void ProcessQueue(std::tr1::shared_ptr<Queue> queue_ptr, const int priority) {}
呼叫
根據正常邏輯情況,已經使用物件管理資源,應該不會導致記憶體洩露了吧,但是這種呼叫方法的確會引起記憶體洩露 呼叫函式,編譯器先對實參入棧,一般順序都是從右往左,對ProcessQueue函式,編譯器要進行如下計算ProcessQueue(std::tr1::shared_ptr<Queue>(new Queue), GetPriority(1));
①呼叫GetPriority(1)
②new Queue
③呼叫shared_ptr的建構函式
對於一些編譯器的執行順序可不確定,假如先呼叫②,再呼叫①,最後是③,看起來還是沒問題吧。但是如果在呼叫② 時丟擲異常,那麼new的記憶體就會被遺失,沒有為放到物件資源管理器shared_ptr中,導致記憶體洩露。
那麼該如何去防止這種情況呢?分離語句
①先new建立物件
②把物件放到智慧指標中(可與①合併)
修改呼叫方式
std::tr1::shared_ptr<Queue> queue(new Queue);
ProcessQueue(queue, GetPriority(1));
記住
以獨立語句將newed物件儲存於(置入)智慧指標內.如果不這樣做,一旦異常被丟擲,有可能導致難以察覺的資源洩露.