作者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