delphi - 这个无效指针在哪里?

标签 delphi pointers free

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

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

它报告此异常消息:

Invalid pointer operation. objCur is TXX_TEA type.
objCur: TXX_TEA;

在 TXX_TEA.Destroy 中我有以下代码

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

在 debugView 中我看到以下消息:

Inside Destroy
...
End of Destroy

Exception: Invalid pointer operation

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

最佳答案

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

对象的内存在最外层析构函数返回调用者之前被释放。本例中的调用者是TObject.Free。调用 inherited 不会导致对象的内存被释放,因为编译器知道这不是最外层的调用。

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

关于delphi - 这个无效指针在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081017/

相关文章:

c - C 中赋值错误中的左值无效

c - 为什么 malloc 在这里返回 NULL?

angular - 在没有 apikey 的情况下使用带有 angular 6 的 tinyMCE(免费)

c - 释放字符串数组的函数

delphi - 如何解释 CPU 窗口反汇编 Pane 中的列?

android - 将自定义JAR库添加到Android项目时,Delphi10.2中出现编译器错误

delphi - 框架依赖是否有问题?

delphi - 扩展TWebBrowser外部对象来执行Delphi代码: how to access my form components?

c# - 使用从 C# 到非托管驱动程序的嵌入式指针编码结构

c - 免费功能失败