【发布时间】: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属性时,它是否已经被释放了