德尔福文献状态:
永远不要直接引发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异常对象有什么特殊之处吗?如果这不是一个好主意,那么在这里简单地提出一个自定义的例外会是明智的吗?
发布于 2016-12-20 20:19:49
对大卫的回答的补充;用于引发EInvalidPointer的InvalidPointer与OutOfMemory <-> EOutOfMemory有什么特殊之处,将在文档主题中更详细地解释它们的优势EHeapException
EHeapException是与堆分配内存相关的错误的异常类。 EHeapException's后代--EOutOfMemory和EInvalidPointer-用于处理动态内存分配失败和指针操作无效。 注意事项:每当应用程序启动时,只要应用程序运行,就会预先分配这些异常的内存。永远不要直接抚养EHeapException或其后代。
这相当于我猜,在内存出现问题时为创建这些错误分配内存可能是不安全的:因为内存不足或可能出现损坏……
发布于 2016-12-20 18:46:56
避开最初的问题,只需使用与运行时相同的代码,就可以避免问它:
System.Error(reInvalidPtr);https://stackoverflow.com/questions/41248963
复制相似问题