为什么不提高EInvalidPointer?

Delphi文档指出:

切勿直接引发EInvalidPointer异常。 EInvalidPointer由内存管理器在内部引发。

我正在编写一个自定义基类作为TInterfacedObject的替代方法, TInterfacedObject遵循RTL实现,并通过示例查看RTL中的BeforeDestructionTInterfacedObject实现为:

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?