c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源
P.8: 勿泄漏任務(wù)資源
原因
隨著時(shí)間的推移,即使是資源的緩慢增長(zhǎng)也會(huì)耗盡這些資源的可用性,這對(duì)于長(zhǎng)時(shí)間運(yùn)行的程序特別重要,但也是負(fù)責(zé)任的編程行為的基本部分。
糟糕的例子
void f(char* name){ FILE* input = fopen(name, "r"); // ... if (something) return; // 糟糕:如果 something == true,文件句柄就泄漏了 // ... fclose(input);}優(yōu)先使用RAII:
void f(char* name){ ifstream input {name}; // ... if (something) return; // OK: 沒有泄漏 // ...}參考: 資源管理部分
注意
泄漏通俗地說就是“任何沒有被清理的東西”,更重要的分類是“任何不能再被清理的東西”。例如,在堆上分配了一個(gè)對(duì)象,然而丟失了指向該塊內(nèi)存(分配)的指針。 不應(yīng)將此規(guī)則應(yīng)用在程序關(guān)閉期間需返回長(zhǎng)生命周期對(duì)象的分配(譯注:在程序退出期間的內(nèi)存分配可以不需要遵守這些規(guī)則),例如,依賴于系統(tǒng)保證的清理可以簡(jiǎn)化代碼,比如關(guān)閉文件和在進(jìn)程關(guān)閉時(shí)釋放內(nèi)存。然而,依賴于隱式清理的抽象也同樣簡(jiǎn)單,而且通常更安全。
注意
使用生命周期安全性剖面(profile) 來消除泄漏,當(dāng)與RAII提供的資源安全相結(jié)合時(shí),就沒了"垃圾回收"的需求。當(dāng)使用類型和邊界剖面(profiles)時(shí),你可以獲得由工具保證的類型和資源安全。
實(shí)施
- 查看指針:將它們分為非所有者(默認(rèn))和所有者(owner),在可行的地方,用標(biāo)準(zhǔn)庫(kù)資源句柄替換所有者(如上面的示例所示),或者使用GSL中的owner來標(biāo)記所有者。
- 查看裸用的new和delete
- 查看已知返回原始指針的資源分配函數(shù)(如fopen, malloc 和 strdup)
總結(jié)
以上是生活随笔為你收集整理的c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow实验(2)
- 下一篇: c++用牛顿法开多次根_望远镜的历史之三