怎么释放动态指针数组? ( 积分: 50 )

  • 主题发起人 主题发起人 baiduan
  • 开始时间 开始时间
B

baiduan

Unregistered / Unconfirmed
GUEST, unregistred user!
我声明了一个数组
rectset:array of TRect;
当关闭程序时出错,
提示无效的指针操作,
用了allowmem,freemem,setlength,nil来释放都
不行。
怎么回事啊
 
我声明了一个数组
rectset:array of TRect;
当关闭程序时出错,
提示无效的指针操作,
用了allowmem,freemem,setlength,nil来释放都
不行。
怎么回事啊
 
我怎么觉得不用释放呢?
 
SetLength设置就可以了
如果是局部变量的话,不释放也可以的
 
我也不知道我一开始都是让
系统自己释放的,出错了
才自己释放。
只在这里使用过
procedure TForm1.drawit(img:Timage; sets: array of Trect;allwidth,iwidth,iheight,gapwidth:integer;x,y:integer);
var
i,itmp1,itmp2:Integer;
largemark:Integer;//标志最大数
markx,marky:Integer;
xpos:integer;
//iwidth:Integer; //小格子的宽度
//gapwidth:integer; //缝隙宽度
//allwidth:Integer; //画面宽度
begin
//擦除上次
img.Canvas.Brush.Style:=bsSolid; //擦除canvas
img.Canvas.Brush.Color:=clWhite; //这里虽然是白色但是image1.transtrac:=true;
img.Canvas.FillRect(Rect(img.left,img.Top,img.Width,img.Height));
//画图
allwidth:=img.Width;
largemark:=((allwidth-gapwidth) div(gapwidth+iwidth));
markx:=x;
marky:=y;

for i:=1 to largemark do
begin
self.drawbmpheard(image1.Canvas,Rect(0,0,5*iwidth+6*gapwidth,30),i+markbegin,markx,marky);
xpos:=markx+gapwidth;//在每一循环开头留个空格
for itmp1:=1 to 5 do
begin
self.drawbmpunit(image1.Canvas,Rect(0,0,iwidth,iheight),clGray,clWhite,xpos,marky+34);//
xpos:=xpos+gapwidth+iwidth;//保证下一个小格子的位置
rectset[(i-1)*5+itmp1].Left:=xpos;
rectset[(i-1)*5+itmp1].Top:=marky+34;
rectset[(i-1)*5+itmp1].Right:=xpos+iwidth;
rectset[(i-1)*5+itmp1].Bottom:=rectset[(i-1)*5+itmp1].Top+iheight;
end;
markx:=markx+5*iwidth+5*gapwidth;
end;
markbegin:=markbegin+largemark;//做图完毕改变markbegin
end;

///到底怎么回事啊,大虾来帮帮我啊
 
不管它、不去释放就不会出问题了。
 
可是关闭程序的时候提示无效的指针操作
,如果不调用这个drawit,就不出错。。。。
 
rectset 不初始话怎么行?另外没看到关于它的任何声明。
这样就行了:SetLength(rectset, 5);
另外动态数组下标从 0 开始。
 
奇怪,你的函数里并没有用到sets: array of Trect这个参数呀
 
谢谢dyfh,你看的真仔细。
sets: array of Trect,就是我
用的rectset数组
 
开头加上 SetLength(rectset, 5) 就行了。
参数改成 var sets: array of Trect
 
谢谢vvyang,这个在初始化的时候就做了
所以运行没有出错,但是关闭的时候出错了
 
应该是越界,你看看 rectset[(i-1)*5+itmp1] 这句 rectset 的下标都到多少了?
 
没有越界阿,越界的时候运行就出错。
而且我在新的应用中
procedure TForm1.image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
i:integer;
itemp:Integer;
begin
if not choosebegin then exit;
for i:=0 to length(rectset)-1 do
begin
if (x>=rectset.Left)and (x<rectset.Right) then
begin
image1.Canvas.Brush.Color:=clgreen;
image1.Canvas.FillRect(rectset);
end;
end;
end;

//这个时候也没有错,总之运行都正常,但是关闭出错
//我头都晕了。。。
 
你试验一下再下断言。
另外敢保证 drawbmpheard 和 drawbmpunit 没问题么??
 
有时越界不提示的,还是跟一下确认一下
 
不提示....我跟踪以下
 
谢谢 vvyang 和dyfh 两位大虾,
原来是越界的问题,运行时没提示
释放的时候就出错了。。。。。。
 
后退
顶部