无效指针操作!(50分)

  • 主题发起人 主题发起人 yxdelphi
  • 开始时间 开始时间
Y

yxdelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
vl_mx: array of Tstrings;
//
setlength(vl_mx,vl_count);
......
vl_mx[i+1] := TStringList.Create;
........
//
vl_mx := nil//这句报无效指针操作!
 
那是当然,
你这样不就行了吗?
vl_mx.clear;
 
和最后一行没关系, 估计是你前面赋值时越界了. 动态数组下标是从0开始的.
 
动态数组是生存期自管理的,用完后没有必要释放
不过释放也没问题
你的这一段没问题
procedure TForm1.Button1Click(Sender: TObject);
var
vl_mx: array of Tstrings;
begin
setlength(vl_mx,5);
vl_mx[0] := TStringList.Create;
vl_mx := nil;
end;
 
赋值越界为什么不报错呢!
 
tseug说的对
我以前也碰到过这种问题!
动态数组下标是从0开始的
 
要释放的话用For语句用下标一个一个释放
 
要释放TStrings的所有资源
 
是不是在程序退出时才报的错。

动态数组是Delphi的内存管理器自动维护的,在程序退出
时,内存管理器自动释放动态数组,如果你在程序退出之
前给动态数组赋值,比如nil,则内存管理器就会尝试释放
指向nil的动态数组,这时当然会出错。如果你一定要亲自
释放,则可以采用SetLength(some_array,0)的形式。
 
把 range checking打开
 
最麻烦的,但养成好习惯问题就少多了!
 
SetLength(some_array,0)具体操作了什么?
 
还有:
var
vSJJD :TStringList;
.........

if not Assigned(vSJJD) then
vSJJD :=TStringList.Create;

if vSJJD.Count >0 then//我用free后此句报错,用nil就不报错!

vSJJD.free;//vSJJD := nil;
//free,nil有什么区别!!

 
SetLength(some_array,0)的作用就是:
将some_array这个动态数组所占用的内存释放,并将nil赋值给some_array。

Free的作用是将对象所占用的内容释放,而nil的作用是给对象赋值。
而Assigned的作用是判断对象指针是否指向nil如果为nil则返回false否则true;
最好的方法是在Free以后再赋值nil。
 
var
vSJJD :TStringList;
.........

if not Assigned(vSJJD) then//如果没有下面的vSJJD := nil;这里将为True
vSJJD :=TStringList.Create;//上面为True的话这句就不会执行

vSJJD.free;//上面没有Create,这里当然要出错
vSJJD := nil;//这里应该要

顺便到我这里凑凑热闹http://www.delphibbs.com/delphibbs/dispq.asp?lid=918616
 
多人接受答案了。
 
后退
顶部