【问题标题】:Invalid Pointer Operation on dynamic array free动态数组上的无效指针操作免费
【发布时间】:2015-04-21 01:02:32
【问题描述】:

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

定义:

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 任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 您的代码中有一个错误,但它在我们看不到的代码中。请提供一个完整的程序来演示故障。
  • 您显示的代码永远不会暴露此问题。我怀疑您使用了错误的索引导致内存损坏。您的项目是否启用了范围检查?
  • 我的代码只有在我调用释放矩阵的过程时才会崩溃。有时,异常被调用,有时异常不会触发,但我得到 fastmm4 错误和无效指针,但大多数时候代码执行良好。无论哪种方式,我都会用我的矩阵初始化和使用它的过程来编辑我的问题..

标签: delphi firemonkey delphi-xe6


【解决方案1】:

对此最可能的解释是您在数组边界之外进行写入。没有足够的代码让我们确定是这种情况,但您报告的症状总是由越界访问引起的。

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

【讨论】:

  • 我很确定我没有弄乱可能会跳过数组边界的变量,我忘了检查我是否没有用行交换列。这就是问题所在,我觉得很愚蠢.另一个教训。谢谢。
  • 范围检查是您的朋友! ;-)
  • 啊,很高兴看到我的通灵调试技巧是正确的 :)
  • @whosrdaddy FWIW,我实际上是在阅读您的评论之前写下了我的答案。显然,这一定是堆损坏,并且越界访问是最好的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多