Discussion: Never throw while holding a resource not owned by a handlegit
討論:持有沒有被句柄管理的資源時切勿拋出異常github
Reason(緣由)web
That would be a leak.編程
這回引起資源泄露。
設計模式
Example(注意)微信
void f(int i)
{
FILE* f = fopen("a file", "r");
ifstream is { "another file" };
// ...
if (i == 0) return;
// ...
fclose(f);
}
If i == 0 the file handle for a file is leaked. On the other hand, the ifstream for another file will correctly close its file (upon destruction). If you must use an explicit pointer, rather than a resource handle with specific semantics, use a unique_ptr or a shared_ptr with a custom deleter:架構
若是i == 0,則文件的句柄發生泄漏。另外一方面,另外一個文件的ifstream將正確關閉其文件(銷燬時)。若是必須使用顯式指針,而不是具備特定語義的資源句柄,請使用帶有自定義刪除器的unique_ptr或shared_ptr:app
void f(int i)
{
unique_ptr<FILE, int(*)(FILE*)> f(fopen("a file", "r"), fclose);
// ...
if (i == 0) return;
// ...
}
Better:ide
更好的作法:工具
void f(int i)
{
ifstream input {"a file"};
// ...
if (i == 0) return;
// ...
}
Enforcement(實施建議)
A checker must consider all "naked pointers" suspicious. A checker probably must rely on a human-provided list of resources. For starters, we know about the standard-library containers, string, and smart pointers. The use of span and string_view should help a lot (they are not resource handles).
檢查器必須將全部「暴露的指針」視爲可疑。檢查器可能必須依靠人工提供的資源列表。首先,咱們瞭解標準庫容器,字符串和智能指針。使用span和string_view應該會頗有幫助(它們不是資源句柄)。
原文連接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#discussion-never-throw-while-holding-a-resource-not-owned-by-a-handle
新書介紹
《實戰Python設計模式》是做者最近出版的新書,拜託多多關注!
本書利用Python 的標準GUI 工具包tkinter,經過可執行的示例對23 個設計模式逐個進行說明。這樣一方面能夠使讀者瞭解真實的軟件開發工做中每一個設計模式的運用場景和想要解決的問題;另外一方面經過對這些問題的解決過程進行說明,讓讀者明白在編寫代碼時如何判斷使用設計模式的利弊,併合理運用設計模式。
對設計模式感興趣並且但願隨學隨用的讀者經過本書能夠快速跨越從理解到運用的門檻;但願學習Python GUI 編程的讀者能夠將本書中的示例做爲設計和開發的參考;使用Python 語言進行圖像分析、數據處理工做的讀者能夠直接以本書中的示例爲基礎,迅速構建本身的系統架構。
以爲本文有幫助?請分享給更多人。
關注微信公衆號【面向對象思考】輕鬆學習每一天!
面向對象開發,面向對象思考!
本文分享自微信公衆號 - 面向對象思考(OOThinkingDalian)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。