动态数组清空问题 ( 积分: 30 )

  • 主题发起人 主题发起人 pl5th2001
  • 开始时间 开始时间
P

pl5th2001

Unregistered / Unconfirmed
GUEST, unregistred user!
这个是我在网上找的,不过运行不对
我的数组是这样定义的 DrawRects:Array of Tpoint; 里面放了窗体的上的一个个点的坐标
procedure DynArraySetZero(var A);
var
P: PLongint;
begin
P := PLongint(A);
Dec(P);
P^ := 0;
Dec(P);
P^ := 0;
end;
 
这个是我在网上找的,不过运行不对
我的数组是这样定义的 DrawRects:Array of Tpoint; 里面放了窗体的上的一个个点的坐标
procedure DynArraySetZero(var A);
var
P: PLongint;
begin
P := PLongint(A);
Dec(P);
P^ := 0;
Dec(P);
P^ := 0;
end;
 
我对动态的没什么研究,希望下面这段网上摘的对你有帮助
当用到数组时经常采用动态数组。在声明时,如:A : array of string,然后在使用数组之前,SetLength(A,3)设置数组长度为3,即A[0],A[1],A[2],这样就可以了。当需要扩大数组长度时,再一次:SecLength(A,5),那么,就增加了A[3]和A[4],而前面的A[0],A[1],A[2]里的值不会清空;同样,如果SecLength(A,3)后再SecLength(A,1)的话,就只剩A[0]了,A[1]和A[2]自动被清除内存.
最后当不再用这个动态数组了,而程序还没有要退出,那为了节省内存用:A:=nil来释放掉这个数组,
 
如果是Tpoint的动态数组,这样应该可以吧
SetLength(SelectedPoints, 0);
nPointCount := 0;
 
SetLength(A, 0)就可以释放内存了。
 
这段代码只是将动态数组(和string 结构一样)的长度计数和引用计数清成0而已, 但是没有释放内存, 所以直接用的话会存在内存泄露. 只在这个动态数组处于一大块其它内存中间时才有用(也就是说这个动态数组不是用标准方法产生的而是通过强制类型转换将其它内存中的某个起始地址强转过来的), 这时要清掉这个动态数组中的内容时就只可以用上述代码了, 不能用SetLength了, SetLength(a, 0)后会尝试dispose的.
 
是啊.这段代码有问题.因为直接把长度和计数器修改成0.当前变量确实是空了.但是指向的那片内存并没有释放,会造成内存泄漏.
 
多人接受答案了。
 

Similar threads

后退
顶部