无动态数组上的指针操作无效

时间:2015-02-19 15:42:47

标签: delphi firemonkey delphi-xe6

我是德尔福的新手,所以要好心的。 我正在开发一种软​​件,允许用户自定义其界面(按钮的位置,外观,wtv)和其他一些东西。 问题是,我有一个网格,我将其单元格的表示存储在一个动态布尔数组中,表示哪些单元格被占用。但是当我尝试释放该矩阵有时时,我得到一个无效的指针操作。有时没有任何错误,但有时我会得到无效的指针。

定义:

type
  TMatrix = array of array of Boolean;

var
  Matrix: TMatrix;

初​​始化:

SetLength(Matrix, MyGrid.ColumnCollection.Count, MyGrid.RowCollection.Count);

使用方法: 大多数情况下,这些操作是我与矩阵一起使用的唯一操作,并且我确定那些变量col,row,colspan,rowspan永远不会有大于数组边界的值

//Checks if a set of cells are occupied
for i := column to (column + columnspan)-1 do
          begin
            for j := row to (row + rowspan)-1 do
            begin
              if Matrix[i, j] then
              begin
                valido := False;
              end;
            end;
          end;
     // if there isnt any cell occupied i can move a component to that location and i set the cells to true ( occupied)
    if (valido) then
          begin
              for i := column to (column + colspan)-1 do
                begin
                  for j := row to (row + rowspan)-1 do
                  begin
                    Matrix[i,j]:= True;
                  end;
                end;
          end

免:

try
            begin
               SetLength(Matrix,0,0);
            end;
          except
            on E : Exception do
            begin
              //todo
              ShowMessage('Free: ' + E.Message);
            end;
          end;

我使用FASTMM4并且确实收到了内存泄漏警告,但我无法理解其内容..

可能导致此错误的原因是什么? 我正在使用Delphi Xe6 Firemonkey 任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:1)

最可能的解释是你在数组范围之外写作。我们没有足够的代码来确保是这种情况,但您报告的症状总是由越界访问引起。

下一步是让编译器编写检查我们的边界访问的代码。在项目选项的编译器部分中,找到范围检查选项。启用此选项。现在编译器将发出代码,在您访问阵列时检查数组索引是否有效。如果您的代码未通过测试,则在运行时将引发异常。这将使你的代码的哪一部分有缺陷显而易见。