作者Killercat (杀人猫™)
看板C_and_CPP
标题Re: [问题]当数目太大会出现该记忆体不能为"written"?
时间Tue Mar 20 20:55:34 2007
※ 引述《peter0711 (peter0711 )》之铭言:
: 用vector和link list模拟matrix时,希望可以增加节点.
: 目前遇到的问题是为什麽 MAX 的数目最大只能到5000左右,不能再大了呢?
: 若 MAX = 8000,那执行过後,会出现"0x00401466" 指令参考的 "0x00000000"记亿体.
程式码我还没仔细看, 不过看到这行我突然想起了几天前就想打的一篇心得文
不要忽视对NULL位置的access denied error讯息
这东西成因很多, 如果是一个自己写的程式的话多半是肇因於错误的程式设计观念
或者错误的程式流程造成的不易debug错误
这个错误算是很珍贵的错误, 因为通常不易发现也不易debug
很多场合要不是跑出了这个错误, 还很难去得知程式内容有这些leak.
最常发生的原因就是错误的依赖return pointer value函数的性质
比方说new, 普通来讲的确在new失败的时候会传回NULL
而一个程式设计上有时候会为方便, 而直接使用这性质作条件判断
if(!(ptr = new string[n]))
ReportErrorAndTerminate("Fail of memory deploying!");
通常来讲, 以前在C时代应对这种问题, 除了乖乖使用上面这种手法以外
就只能用(非常糟糕的)LongJmp/SetJmp类型函数(这功能严格讲起来跟goto很像)
事实上在C++来讲, 这样写也不能说错,
只是你能保证你每一个pointer operator都会用个if包? 事实上不太可能
而只要一个没包到, 就会造成NULL access denied.
正确的用法是try and catch, 利用std::bad_alloc这个exception ref. class
在catch中正确的捕捉出来. 当然传统方法有其方便的地方
(我先自首, 我大多数的API程式设计都是用传统方法 XD)
不过try and catch同样也是一个很重要的学习重点就是.
这段码我还没看(事实上我大概也要明天可能才有空闲 =P)
也无从测试到底这个NULL access到底是从vector的问题还是使用者的问题
(不过STL不太可能会有这种问题? 号称工业强度的东西说)
既然有了这个得来不易的错误讯息(?)
可能你可以利用try & catch检查一下到底是哪理丢出的exception
直接把整个关键部分程式码用try包起来 後面再用一个catch提示
我想这应该很容易就找出病因了 =P
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.140.109.129