为什么不提高EInvalidPointer?
Delphi文档指出:
切勿直接引发EInvalidPointer异常。 EInvalidPointer由内存管理器在内部引发。
我正在编写一个自定义基类作为TInterfacedObject
的替代方法, TInterfacedObject
遵循RTL实现,并通过示例查看RTL中的BeforeDestruction
将TInterfacedObject
实现为:
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;
在SysUtils
声明的全局InvalidPointer
异常对象有什么特别之处吗? 如果这是一个坏主意,在这里简单地提出一个自定义异常是否明智?
大卫答案的补充; 有关InvalidPointer
(用于引发EInvalidPointer
)以及OutOfMemory
< - > EOutOfMemory
,在文档主题中为其上升的EHeapException
进行了更详细的说明:
EHeapException是与堆分配内存有关的错误的异常类。
EHeapException的后代-EOutOfMemory和EInvalidPointer用于处理动态内存和无效指针操作的失败分配。
注意 :只要应用程序正在运行,应用程序启动时就会预先分配用于这些异常的内存,并保持分配状态。 切勿直接提升EHeapException或其后代。
我认为这就是,一旦内存出现问题,分配内存来创建这些错误可能并不安全:因为缺少内存或可能会损坏...
避开原始问题,您可以避免简单地通过使用与运行时相同的代码来进行询问:
System.Error(reInvalidPtr);
链接地址: http://www.djcxy.com/p/16177.html
上一篇: Why not raise EInvalidPointer?
下一篇: How do I stop parsing an XML document with IVBSAXXMLReader in Delphi?