Delphi的文档声明:
不要直接触发EInvalidPointer异常。 EInvalidPointer由内存管理器内部引发。
我正在编写一个自定义基类作为TInterfacedObject
的替代品,并尽可能地按照 RTL 实现,通过示例,我看到 RTL 中的 TInterfacedObject
将 BeforeDestruction
实现为:
procedure TInterfacedObject.BeforeDestruction;
begin
if RefCount <> 0 then
Error(reInvalidPtr);
end;
Error(reInvalidPtr)
会通过一系列局部于RTL的单元范围方法引发EInvalidPointer
异常。
如果我要编写自己的类,应该如何实现BeforeDestruction
方法?为什么不要这样做?:
procedure TMyInterfacedObject.BeforeDestruction;
begin
if RefCount <> 0 then
raise EInvalidPointer.CreateRes(@SInvalidPointer) at ReturnAddress;
end;
全局InvalidPointer
异常对象在SysUtils
中声明时是否具有特殊性?如果这是个不好的想法,那么在此处引发自定义异常是否明智?
System.Error(reInvalidPtr);
是完全可以的。为什么不直接这样做呢?据我所知,这是发出无效指针异常信号的正确方式。如果这对 RTL 足够好,为什么你不能完全一样呢? - David HeffernanError
没有前向声明(它被埋在implementation
中),所以我认为它根本无法编译。我真是太傻了。 - J...Windows
单元中的ERROR
常量所迷惑,认为它是不可访问的,而找不到前向声明似乎也证实了这一点。我应该试一下的,我猜! - J...