作者XDucka (Duck)
看板EE_DSnP
標題[問題] 為什麼這樣不會segmentation fault
時間Sat Dec 29 20:57:51 2012
就是我在寫sweep的時候發現我delete明明寫在cout的前一行
但是居然沒有segmentation fault=.= 是我沒有delete乾淨嗎@@?
但是我印出原本的gate的位置跟我要delete的gate的位置是一樣的QQ
這是什麼巫術Q_Q
int main(){
GateList g;
g.reserve(10);
for (size_t i = 0; i < 10; ++i) {
g[i]=new AigGate(i,i);
cout<<g[i]<<"\n";
}
set<CirGate*> a;
for (size_t i = 0; i < 10; ++i) {a.insert(g[i]);}
for (set<CirGate*>::iterator li = a.begin(); li != a.end(); ++li) {
cout<<(*li);
delete (*li);
cout<<"<"<<(*li)->getGateId()<<">\n";
}
}
好奇怪@@!
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.25.227.243
1F:推 gamerred:如果是使用new/malloc要到的記憶體都是放在heap裡 12/29 21:12
2F:→ gamerred:所以雖然你非法讀取 但都是同一個segment 12/29 21:13
3F:→ gamerred:如果記憶體放不同page 作業系統才可能抓到錯誤 12/29 21:14
4F:→ gamerred:不然通常作業系統不幫你抓這種錯 成本太高了 12/29 21:15
5F:→ gamerred:即使幫你抓 這也不是segmentation fault 12/29 21:15
6F:→ gamerred:只能算illegal memory access 12/29 21:16
7F:推 simpdanny:XDDD樓上的解答根本是系統工程師的標準解了 12/29 21:17
8F:→ XDucka: 感謝Gred大神 <(_ _)> 12/29 21:19
9F:推 gamerred:其實還是可能出現segmentation fault 12/29 21:20
10F:→ gamerred:那就是你把記憶體還回去之後 那塊記憶體內容又被改掉 12/29 21:20
11F:→ gamerred:這時候對他解參照 如果解完之後又有用到指標 12/29 21:21
12F:→ gamerred:那麼那個指標就有可能指到別的segment 這時候就有了 12/29 21:22
13F:推 ric2k1:呵呵,這個在 lecture note #7, p6 也有教過哦! 12/29 21:50
14F:推 yan12125:valgrind可以抓這種錯誤喔,有時比gdb+cout好用! 12/30 00:16
16F:→ yan12125:樓上連結上不去... 12/30 02:32
17F:推 Nien1027:感覺用delete只是單純把記憶體還回去,並不會真的清掉裡 12/30 16:35
18F:→ Nien1027:面的東西 12/30 16:36