您好,登錄后才能下訂單哦!
本篇內容主要講解“C++為什么在一個表達式中最多只執行一次顯式資源分配”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++為什么在一個表達式中最多只執行一次顯式資源分配”吧!
R.13: 在一個表達式中最多只執行一次顯式資源分配
如果你在一個表達式中執行兩次(或以上的)資源分配,由于包括函數參數在內的子表達式的執行順序是沒有定義的,因此可能導致資源泄露。
Example(示例)
void fun(shared_ptr<Widget> sp1, shared_ptr<Widget> sp2);
函數可能被這樣調用:
// BAD: potential leak
fun(shared_ptr<Widget>(new Widget(a, b)), shared_ptr<Widget>(new Widget(c, d)));
因為編譯器可能會調整構建函數參數的兩個表達式的執行順序,這段代碼在發生異常時會出問題。通常,編譯器會交錯執行兩個表達式:(使用new進行)兩個對象的內存分配可能首先進行,接下來調用兩個Widget的構造函數。如果一個調用某個構造函數是拋出異常,那么另一個就永遠不會被釋放。
這個不易察覺的問題有一個簡單的解決方案:永遠不在一個表達式中執行兩次(含兩次)以上的顯式資源分配。例如:
shared_ptr<Widget> sp1(new Widget(a, b)); // Better, but messy
fun(sp1, new Widget(c, d));
最好的解決方案是使用返回管理對象的工廠方法徹底避免顯式資源分配。
fun(make_shared<Widget>(a, b), make_shared<Widget>(c, d)); // Best
如果目前還不存在,那就自己寫工廠包裝類。
Enforcement(實施建議)
標記具有多個顯式分配資源的表達式(問題是:我們可以識別出多少顯式分配資源的情況?)
到此,相信大家對“C++為什么在一個表達式中最多只執行一次顯式資源分配”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。