这个无效指针在哪里?

sps*_*pli 3 delphi free pointers

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

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

它报告此异常消息:

指针操作无效.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;
Run Code Online (Sandbox Code Playgroud)

在debugView中,我看到以下消息:

内部毁灭
...... 毁灭
结束

例外:无效的指针操作

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

Rob*_*edy 9

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

在最外层的析构函数返回到调用者之前释放对象的内存.在这种情况下,呼叫者是TObject.Free.调用inherited不会导致释放对象的内存,因为编译器知道它不是最外层的调用.

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


Mas*_*ler 6

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