首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不提高EInvalidPointer呢?

为什么不提高EInvalidPointer呢?
EN

Stack Overflow用户
提问于 2016-12-20 18:26:29
回答 2查看 302关注 0票数 12

德尔福文献状态

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

我正在编写一个自定义基类,作为TInterfacedObject的替代,尽可能地紧跟RTL实现,并通过实例看到RTL中的TInterfacedObjectBeforeDestruction实现为:

代码语言:javascript
复制
procedure TInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);  
end;

其中,Error(reInvalidPtr)通过RTL本地的各种单元作用域方法来引发EInvalidPointer

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

代码语言:javascript
复制
procedure TMyInterfacedObject.BeforeDestruction;
begin
  if RefCount <> 0 then
    raise EInvalidPointer.CreateRes(@SInvalidPointer) at ReturnAddress;
end;

InvalidPointer中声明的全局SysUtils异常对象有什么特殊之处吗?如果这不是一个好主意,那么在这里简单地提出一个自定义的例外会是明智的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-20 20:19:49

大卫的回答的补充;用于引发EInvalidPointerInvalidPointerOutOfMemory <-> EOutOfMemory有什么特殊之处,将在文档主题中更详细地解释它们的优势EHeapException

EHeapException是与堆分配内存相关的错误的异常类。 EHeapException's后代--EOutOfMemory和EInvalidPointer-用于处理动态内存分配失败和指针操作无效。 注意事项:每当应用程序启动时,只要应用程序运行,就会预先分配这些异常的内存。永远不要直接抚养EHeapException或其后代。

这相当于我猜,在内存出现问题时为创建这些错误分配内存可能是不安全的:因为内存不足或可能出现损坏……

票数 9
EN

Stack Overflow用户

发布于 2016-12-20 18:46:56

避开最初的问题,只需使用与运行时相同的代码,就可以避免问它:

代码语言:javascript
复制
System.Error(reInvalidPtr);
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41248963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档