由Access Violation谈起

来源:互联网 发布:幻想神域辅助软件 编辑:程序博客网 时间:2024/04/29 17:42

郁闷篇
  下午调试程序,碰到了一个“Access violation at...”错误,据说这位拥有着“最令人头大的Windows程序错误之一”的美誉。因为代码量不小,没办法,只好分区排雷了。扫了一遍,代码逻辑没有问题,那就是出在某个该死的细节上,非法访问内存地址了,我知道最让人崩溃的时刻已经来临:“WK,为什嘛???”(办公室不允许抽风,只能在心里诅咒的说)...
  中场休息中...抽支烟去...
  回到座位上,怎么办?有什么好办法吗?没有!逐行跟踪呗...就这样,时间伴随着我的痛苦也一秒一分地过去了...
  如果说程序Bug最能令人沮丧的话,那么找出Bug的时候恐怕也是让人最开心的时刻。终于,在离下班还有将近半小时的时候,哥们终于把目标定位了
    

  如果是Delphi高手看到这个,估计我已经被鄙视N遍了。呵呵,其实哥们我看到这里,心都绿了,居然犯下如此“高级”的错误。“什么?没看懂?”好吧,简单的做个业余介绍:这里的数组ArrData是个指针,那么Sizeof(ArrData)是多少?对,4Byte啦...

 

自省篇
  伤心+伤心+伤心...
  痛定思痛,既然会在这里犯错,说明自己这一块有欠缺,然后呢?google+翻书呀!百度?呵呵,算了吧,不解释...

   

  函数原型:

  1.  function SizeOf(X): Integer;
        返回一个变量或类型X在内存中所占的字节数;
  2.  function Length(S): Integer;
        返回一个字符串中的字符数或一个数组中的元素数;

  3.   procedure SetLength(var S; NewLength: Integer);
  设置一个字符串或动态数组变量的大小为NewLength。对于ShortString,NewLength必须处于[0, 255]之间,SetLength重新为S分配内存,S中已有的字符或元素保留,但新分配的内存空间未定义。另外,对于多维动态数组,可以指定多个参数,来指定S的各个维度(具体请参考Delphi Help);

  4.  function Copy(S; Index, Count: Integer): string;
     function Copy(S; Index, Count: Integer): array;
  S可以是一个字符串或动态数组,Copy返回由Index和Count共同指定的子串或子数组。如果Index大于S的Length,Copy返回空;如果Count过大,则Copy返回从Index开始直到S结束的子串或子数组。另外,Copy返回的子数组或子串与源S相对独立,不共享内存,这一点和操作符“:=”不同。如果使用:=,则源数组和目标数组共同指向内存中同一份数据,二者唇齿相依(具体请参考Delphi Help);
  5.  function High(X);
     function Low(X);
  简单地说就是返回X的上下界值。对于数组,则High返回上界减1,而Low返回下界。特别地,空数组,High返回-1,Low返回0(具体请参考Delphi Help)。


      下面我们来做个测试:

呃,是该回头好好重温一些东西了!

------------------------------------------------

以上只是个人一些浅薄的认识,欢迎指正讨论......

原创粉丝点击