为什么不提高EInvalidPointer?

J..*_*... 11 delphi invalid-pointer

Delphi 文档说明:

永远不要直接引发EInvalidPointer异常.EInvalidPointer由内存管理器在内部引发.

我正在编写一个自定义基类作为替代TInterfacedObject,尽可能地遵循RTL实现,并且通过示例看,TInterfacedObject在RTL实现BeforeDestruction为:

procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);  
end;
Run Code Online (Sandbox Code Playgroud)

其中Error(reInvalidPtr)提出了EInvalidPointer通过各种本地的RTL单元范围的方法.

如果我正在编写自己的课程,我应该如何实施BeforeDestruction?为什么不这样做?:

procedure TMyInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    raise EInvalidPointer.CreateRes(@SInvalidPointer) at ReturnAddress;
end;
Run Code Online (Sandbox Code Playgroud)

InvalidPointer声明的全局异常对象是否有特殊之处SysUtils?如果这一个坏主意,那么在这里简单地提出一个自定义异常是否明智?

Ser*_*yuz 9

大卫回答的补充; 什么是特别的InvalidPointer,用于引发EInvalidPointer,与OutOfMemory< - > 一起EOutOfMemory在文档主题中更详细地解释了它们的方兴未艾EHeapException:

EHeapException是与堆分配的内存相关的错误的异常类.

EHeapException的后代-EOutOfMemory和EInvalidPointer-用于处理动态内存和无效指针操作的失败分配.

注意:只要应用程序启动,就会预先分配这些异常的内存,并在应用程序运行时保持分配.永远不要直接引发EHeapException或其后代.

我猜这个数字是多少,一旦你遇到内存问题,分配内存来创建这些错误可能不安全:因为缺乏内存或可能存在腐败......


Dav*_*nan 6

避开原始问题,您可以避免仅使用与运行时相同的代码来询问它:

System.Error(reInvalidPtr);
Run Code Online (Sandbox Code Playgroud)