【问题标题】:Error while deleting 3D dynamic array in Pascal在 Pascal 中删除 3D 动态数组时出错
【发布时间】:2017-03-29 20:33:14
【问题描述】:

关键是让它与指针一起工作。另外,我用 C++ 找到了similar problem。它不适用于帕斯卡,好吧,我很可能。错过了什么。

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)

任何帮助表示赞赏。

【问题讨论】:

  • 为什么不使用 pascal 来实现它的知名之处,即类型安全。有关如何在 pascal 中使用动态数组的示例,请参阅 Multidimensional dynamic array
  • pascal做C风格的指针+整数加法吗?

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


【解决方案1】:

最后一个 dispose 镜像到它的 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 );

附言freemem 是 getmem 的逻辑伴侣,就像 dispose 对于 new 一样。

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多