[问题] 为什么这样不会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