【问题标题】:Where is this invalid pointer?这个无效指针在哪里?
【发布时间】:2011-08-17 00:15:19
【问题描述】:

我有以下代码(我检查了 objCur 在 free 之前不是 Nil}:

try
  objCur.Free;
Except on E:Exception do
  begin
    OutputDebugString(PChar('Exception '+E.Message));
    Assert(False);
  end;
end;

它报告这个异常消息:

无效的指针操作。 objCur 是 TXX_TEA 类型。
objCur: TXX_TEA;

在 TXX_TEA.Destroy 我有以下代码

destructor TXX_TEA.Destroy;
begin
  OutputDebugString(PChar('Inside Destroy'));
  ...
  inherited;
  OutputDebugString(PChar('End of Destroy'));
end;

在 debugView 中我看到以下消息:

内部破坏
...
毁灭结束

异常:无效的指针操作

我知道 objCur.Free 调用 TXX_TEA.Destroy,但看起来 TXX_TEA.Destroy 执行没有错误。那么我应该在哪里追踪这个无效的指针操作呢?

【问题讨论】:

  • 检查objCur 是否为非零是不够的。事实上,如果它 nil,你根本不会有任何问题。您需要检查它是否引用了一个有效的对象,这实际上不是您可以通过编程检查的东西。您需要通过分析您的程序进行检查,并确保您没有任何会导致变量引用无效的错误。
  • 其实我想知道objCur.Free的时候,会不会先调用TXX_TEA.Destroy,然后再释放自身的属性?因为在TXX_TEA中,有一个属性Allos,Allos[i].xx = self.xx;在 TXX_TEA.Destroy 中,调用了 Allos.Free。所以我怀疑当objCur释放它的xx属性时,它是否已经被释放了

标签: delphi pointers free


【解决方案1】:

当要求内存管理器释放不属于它的内存时,会发生无效的指针操作。

一个对象的内存在最外面的析构函数返回给调用者之前被释放。在这种情况下,调用者是TObject.Free。调用inherited 不会释放对象的内存,因为编译器知道它不是最外层的调用。

显然,您正在释放一个实际上并不存在的对象,但这个假定对象的内存内容看起来足够有效,以至于清除对象字段的析构函数中的代码不会崩溃。只有当析构函数完成运行并且对象将被释放时,内存管理器才会检测到该地址没有引用当前分配的任何内容。

【讨论】:

    【解决方案2】:

    当您试图释放某些东西时,一个无效的指针操作几乎总是意味着它已经被释放了。如果你想找到哪里,最简单的方法是从 SourceForge 获取完整版的 FastMM。阅读文档,它将向您展示如何将其添加到您的项目以及如何打开 FullDebugMode。启用 FullDebugMode 后,当您尝试释放已释放的内容时,它会通过一个对话框中断程序,该对话框会为您提供第一次释放对象时的堆栈跟踪等信息。这应该可以帮助您跟踪错误。

    【讨论】:

      【解决方案3】:

      很可能你仍然有一个对它的引用,并且某些代码在释放后使用该引用来访问对象。这可以是对象引用或接口引用(非 nil 的接口引用将在作用域结束时调用 _Release)。

      我们必须查看更多代码才能真正找出原因。

      【讨论】:

      • 那么有没有通用的方法可以找出对象引用或者接口引用在哪里呢?
      • 使用 RTL 和 VCL 调试单元进行调试将帮助您了解实际发生的情况以及可能出现问题的地方。还请查看引发异常之前的堆栈跟踪。
      • +1 for 'stack trace before the exception is raise' - 如果你从 IDE 调试选项调用'break on language exceptions',你的调用堆栈在调试器中仍然完好无损出来。这通常会揭示一个神秘异常的潜在来源。
      猜你喜欢
      • 2019-08-03
      • 2014-05-04
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      相关资源
      最近更新 更多