作者:
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 也有教過哦!
valgrind可以抓這種錯誤喔,有時比gdb+cout好用!
作者: Nien1027 (隨便) 0000-00-00 00:00:00
感覺用delete只是單純把記憶體還回去,並不會真的清掉裡面的東西