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