国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

Bjarne:如何對(duì)付內(nèi)存泄漏?

2019-11-17 05:13:06
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  寫(xiě)出那些不會(huì)導(dǎo)致任何內(nèi)存泄漏的代碼。很明顯,當(dāng)你的代碼中到處布滿了new 操作、delete操作和指針運(yùn)算的話,你將會(huì)在某個(gè)地方搞暈了頭,導(dǎo)致內(nèi)存泄漏,指針引用錯(cuò)誤,以及諸如此類的問(wèn)題。這和你如何小心地對(duì)待內(nèi)存分配工作其實(shí)完全沒(méi)有關(guān)系:代碼的復(fù)雜性最終總是會(huì)超過(guò)你能夠付出的時(shí)間和努力。于是隨后產(chǎn)生了一些成功的技巧,它們依靠于將內(nèi)存分配(allocations)與重新分配(deallocation)工作隱藏在易于治理的類型之后。標(biāo)準(zhǔn)容器(standard containers)是一個(gè)優(yōu)秀的例子。它們不是通過(guò)你而是自己為元素治理內(nèi)存,從而避免了產(chǎn)生糟糕的結(jié)果。想象一下,沒(méi)有string和vector的幫助,寫(xiě)出這個(gè):

#include<vector>
#include<string>
#include<iostream>
#include<algorithm>

using namespace std;

int main() // small PRogram messing around with strings
{
 cout << "enter some whitespace-separated Words:/n";
 vector<string> v;
 string s;
 while (cin>>s) v.push_back(s);
 sort(v.begin(),v.end());
 string cat;
 typedef vector<string>::const_iterator Iter;
 for (Iter p = v.begin(); p!=v.end(); ++p) cat += *p+"+";
 cout << cat << ’/n’;
}

  你有多少機(jī)會(huì)在第一次就得到正確的結(jié)果?你又怎么知道你沒(méi)有導(dǎo)致內(nèi)存泄漏呢?

  注重,沒(méi)有出現(xiàn)顯式的內(nèi)存治理,宏,造型,溢出檢查,顯式的長(zhǎng)度限制,以及指針。通過(guò)使用函數(shù)對(duì)象和標(biāo)準(zhǔn)算法(standard algorithm),我可以避免使用指針——例如使用迭代子(iterator),不過(guò)對(duì)于一個(gè)這么小的程序來(lái)說(shuō)有點(diǎn)小題大作了。

  這些技巧并不完美,要系統(tǒng)化地使用它們也并不總是那么輕易。但是,應(yīng)用它們產(chǎn)生了驚人的差異,而且通過(guò)減少顯式的內(nèi)存分配與重新分配的次數(shù),你甚至可以使余下的例子更加輕易被跟蹤。早在1981年,我就指出,通過(guò)將我必須顯式地跟蹤的對(duì)象的數(shù)量從幾萬(wàn)個(gè)減少到幾打,為了使程序正確運(yùn)行而付出的努力從可怕的苦工,變成了應(yīng)付一些可治理的對(duì)象,甚至更加簡(jiǎn)單了。

  假如你的程序還沒(méi)有包含將顯式內(nèi)存治理減少到最小限度的庫(kù),那么要讓你程序完成和正確運(yùn)行的話,最快的途徑也許就是先建立一個(gè)這樣的庫(kù)。

  模板和標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)了容器、資源句柄以及諸如此類的東西,更早的使用甚至在多年以前。異常的使用使之更加完善。

  假如你實(shí)在不能將內(nèi)存分配/重新分配的操作隱藏到你需要的對(duì)象中時(shí),你可以使用資源句柄(resource handle),以將內(nèi)存泄漏的可能性降至最低。這里有個(gè)例子:我需要通過(guò)一個(gè)函數(shù),在空閑內(nèi)存中建立一個(gè)對(duì)象并返回它。這時(shí)候可能忘記釋放這個(gè)對(duì)象。究竟,我們不能說(shuō),僅僅關(guān)注當(dāng)這個(gè)指針要被釋放的時(shí)候,誰(shuí)將負(fù)責(zé)去做。使用資源句柄,這里用了標(biāo)準(zhǔn)庫(kù)中的auto_ptr,使需要為之負(fù)責(zé)的地方變得明確了。

#include<memory>
#include<iostream>

using namespace std;

strUCt S {
 S() { cout << "make an S/n"; }
 ~S() { cout << "destroy an S/n"; }
 S(const S&) { cout << "copy initialize an S/n"; }
 S& Operator=(const S&) { cout << "copy assign an S/n"; }
};

S* f()
{
 return new S; // 誰(shuí)該負(fù)責(zé)釋放這個(gè)S?
};

auto_ptr<S> g()
{
 return auto_ptr<S>(new S); // 顯式傳遞負(fù)責(zé)釋放這個(gè)S
}

int main()
{
 cout << "start main/n";
 S* p = f();
 cout << "after f() before g()/n";
 // S* q = g(); // 將被編譯器捕捉
 auto_ptr<S> q = g();
 cout << "exit main/n";
 // *p產(chǎn)生了內(nèi)存泄漏
 // *q被自動(dòng)釋放
}
  在更一般的意義上考慮資源,而不僅僅是內(nèi)存。

  假如在你的環(huán)境中不能系統(tǒng)地應(yīng)用這些技巧(例如,你必須使用別的地方的代碼,或者你的程序的另一部分簡(jiǎn)直是原始人類(譯注:原文是Neanderthals,尼安德特人,舊石器時(shí)代廣泛分布在歐洲的猿人)寫(xiě)的,如此等等),那么注重使用一個(gè)內(nèi)存泄漏檢測(cè)器作為開(kāi)發(fā)過(guò)程的一部分,或者插入一個(gè)垃圾收集器(garbage collector)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 德阳市| 轮台县| 会昌县| 怀化市| 九龙县| 广汉市| 尼勒克县| 辉县市| 方城县| 北票市| 巴青县| 元谋县| 满洲里市| 浙江省| 河西区| 平罗县| 繁峙县| 黎平县| 德阳市| 疏附县| 农安县| 上思县| 北安市| 云林县| 汶上县| 克拉玛依市| 琼结县| 竹北市| 龙海市| 钟山县| 瑞丽市| 六盘水市| 商南县| 潍坊市| 三门县| 杂多县| 进贤县| 盐亭县| 北辰区| 呼和浩特市| 高阳县|