我有以下代码(我在 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 DestroyException: Invalid pointer operation
我知道 objCur.Free 调用 TXX_TEA.Destroy,但看起来 TXX_TEA.Destroy 执行时没有错误。那么我应该在哪里跟踪这个无效的指针操作呢?
最佳答案
当内存管理器被要求释放不属于它的内存时,就会发生无效的指针操作。
对象的内存在最外层析构函数返回调用者之前被释放。本例中的调用者是TObject.Free
。调用 inherited
不会导致对象的内存被释放,因为编译器知道这不是最外层的调用。
显然,您正在释放一个并不真正存在的对象,但是这个假定对象的内存内容看起来足够有效,以至于析构函数中清理对象字段的代码不会崩溃。只有当析构函数完成运行并且对象将被释放时,内存管理器才会检测到该地址未引用当前分配的任何内容。
关于delphi - 这个无效指针在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7081017/