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?如果这是一个坏主意,那么在这里简单地提出一个自定义异常是否明智?
大卫回答的补充; 什么是特别的InvalidPointer,用于引发EInvalidPointer,与OutOfMemory< - > 一起EOutOfMemory在文档主题中更详细地解释了它们的方兴未艾EHeapException:
EHeapException是与堆分配的内存相关的错误的异常类.
EHeapException的后代-EOutOfMemory和EInvalidPointer-用于处理动态内存和无效指针操作的失败分配.
注意:只要应用程序启动,就会预先分配这些异常的内存,并在应用程序运行时保持分配.永远不要直接引发EHeapException或其后代.
我猜这个数字是多少,一旦你遇到内存问题,分配内存来创建这些错误可能不安全:因为缺乏内存或可能存在腐败......