在Pascal中删除3D动态数组时出错

时间:2016-11-15 20:01:25

标签: arrays pointers memory-management multidimensional-array pascal

重点是让它与指针一起使用。另外,我发现了similar problem和C ++。它不与Pascal合作,好吧,我的概率。错过了什么。

1)我为我的指针制作类型和变量:

type
  PReal = ^double;
  PPReal = ^PReal;
var
  data : ^PPReal;

2)这就是我分配内存的方式(x,y,z是维度):

GetMem( data, sizeof(PPReal)*x );
for i:=0 to x-1 do begin
  GetMem( (data+i)^, sizeof(PReal)*y );
  for j:=0 to y-1 do begin
    GetMem( ((data+i)^+j)^, sizeof(real)*z );
  end;
end;

3)这就是我尝试Dispose()它的方式:

for i:=0 to x-1 do begin
  for j:=0 to y-1 do begin
    Dispose( ((data+i)^+j) );
  end;
  Dispose( (data+i) );
end;
Dispose( data );

但是,我得到216(内存访问)或204(无效指针操作)运行时错误。像this一样。完整code(FreePascal IDE)

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

最后一次处置镜像到它的getmem,但其他两个没有镜像。修复它并且它有效:

  for i:=0 to x-1 do begin
    for j:=0 to y-1 do begin
    writeln(i,' ',j,' *');
    Dispose( ((data+i)^+j)^ );
  end;
  writeln(i,' ',j);
  Dispose( (data+i)^ );
end;
Dispose( data );

P.S。 freemem是getmem的逻辑伴侣,因为dispose是新的。