[問題] 為什麼這樣不會segmentation fault

作者: XDucka (Duck)   2012-12-29 20:57:51
就是我在寫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";
}
}
好奇怪@@!
作者: gamerred (game859)   2012-02-29 21:12:00
如果是使用new/malloc要到的記憶體都是放在heap裡所以雖然你非法讀取 但都是同一個segment如果記憶體放不同page 作業系統才可能抓到錯誤不然通常作業系統不幫你抓這種錯 成本太高了即使幫你抓 這也不是segmentation fault只能算illegal memory access
作者: simpdanny (辛普丹尼)   2012-02-29 21:17:00
XDDD樓上的解答根本是系統工程師的標準解了
作者: XDucka (Duck)   2012-02-29 21:19:00
感謝Gred大神 <(_ _)>
作者: gamerred (game859)   2012-02-29 21:20:00
其實還是可能出現segmentation fault那就是你把記憶體還回去之後 那塊記憶體內容又被改掉這時候對他解參照 如果解完之後又有用到指標那麼那個指標就有可能指到別的segment 這時候就有了
作者: ric2k1 (Ric)   2012-02-29 21:50:00
呵呵,這個在 lecture note #7, p6 也有教過哦!
作者: yan12125 (姥姥)   0000-00-00 00:00:00
valgrind可以抓這種錯誤喔,有時比gdb+cout好用!
作者: boiq (olo)   0000-00-00 00:00:00
有時候會可以cout但是卻是垃圾...像這樣http://ppt.cc/CzzC
作者: yan12125 (姥姥)   0000-00-00 00:00:00
樓上連結上不去...
作者: Nien1027 (隨便)   0000-00-00 00:00:00
感覺用delete只是單純把記憶體還回去,並不會真的清掉裡面的東西

Links booklink

Contact Us: admin [ a t ] ucptt.com