Delphi - 为什么 TObject.InitInstance 是公共的?

2023-12-30

我对 Delphi 有点陌生,这个问题只是我好奇。 (我也只是偶然尝试使用它,结果发现我不应该这样做。)

如果您查看文档TObject.InitInstance http://docwiki.embarcadero.com/Libraries/XE4/en/System.TObject.InitInstance它告诉你不要使用它,除非你要重写NewInstance。该方法也是公开的。如果用户不应该调用它,为什么不对其进行保护呢?


由于我在 1992 年中期整个 Delphi 事件开始时就在场,所以这个问题可能有几个答案。如果您查看 Delphi 1 中 TObject 的原始声明,就会发现 TObject 上没有任何受保护/私有成员。这是因为在 Delphi 开发的早期阶段,随着该语言异常的引入,异常是从不同的堆比其他对象。这就是 NewInstance/InitInstance/CleanupInstance/FreeInstance 函数的起源。在您可以真正控制的类类型上重写这些函数where分配了一个对象。

近年来,我使用此功能创建了字面上“回收”的对象实例的缓存。通过拦截 NewInstance 和 FreeInstance,我创建了一个系统,其中实例在解除分配时不会返回到堆,而是放置在无锁/低锁链表上。这使得分配/释放特定类型的实例变得更快,并消除了对内存管理器的大量访问。

通过将 InitInstance 设为公共(其相反是 CleanupInstance),这将允许从其他实用程序函数调用这些方法。在上面我提到的情况下,可以在现有内存块上调用 InitInstance,而不必仅从 NewInstance 调用。假设 NewInstance 调用管理上述缓存的通用函数。类实例的“范围”丢失了,因此调用 InitInstance 的唯一方法是它是公共的。

总有一天,我们可能会发布执行我上面描述的操作的代码……目前它是内部“研究”项目的一部分。

哦,顺便说一句,也是一个历史教训......在 Delphi 1 版本之前,如何分配/释放 Exception 实例的设计又回到了使用与所有其他对象相同的堆。由于整体集体失误,假设我们需要分配所有异常对象实例来“保护”内存不足的情况。我们推断,如果我们尝试引发异常,因为内存管理器“内存不足”,那么我们将如何分配异常实例!?我们已经知道那时没有记忆!因此,我们决定对所有异常都需要一个单独的堆...直到 Chuck Jazdzewski 或 Anders Heijlsberg(我具体忘记了是哪一个)找到了一个简单且相当聪明的解决方案...只是预分配启动时内存不足异常!我们仍然需要控制异常是否应该真正被释放(异常实例在处理后会自动释放),因此整个 NewInstance/FreeInstance 机制仍然存在。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi - 为什么 TObject.InitInstance 是公共的? 的相关文章

  • 在 Outlook 中创建带有附件的邮件并显示它

    我想在 Outlook 中创建一封带有附件的邮件并在发送之前显示它 但我想我已经尝试了几乎在网上找到的所有示例 但没有任何运气 我可以使用 Indy 但我非常想使用 Outlook 来确保邮件正确 因为它是用于商业用途 函数的任何输入 该函
  • Winform 没有.NET 框架?

    我必须创建一些表单并将其作为直接 EXE 提供 而不是安装程序 它安装 NET 框架 最终用户对此不满意 他们想要可以直接打开和工作的东西 我知道它可以作为网络完成 但我正在寻找 winforms 吗 请建议哪种工具 技术可以处理这个问题
  • EIdOSSLUnderlyingCryptoError 和“使用 SSL 连接时出错。错误:14094410...”

    我在 OS X 上的 Delphi 10 1 Berlin 中遇到 Indy 组件问题 我正在使用TIdHTTP使用 HTTPS 连接到 Web 服务 问题是从 OS X 客户端连接到服务器 在 OS X 上运行时 我总是遇到同样的错误 P
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 我应该害怕使用 UDP 进行客户端/服务器广播通话吗?

    我在过去的两天里阅读了每一篇StackOverflow问题和答案 以及googling当然 关于印地TCP and UDP协议 以便决定在我的用户应用程序和 Windows 服务之间的通信方法中应该使用哪一种 从我目前所看到的来看 UDP是
  • Delphi XE2 Firemonkey 示例应用程序未在 MAC 上运行

    我正在尝试在 Mac 上运行示例 Firemonkey 应用程序 但我在 Mac 中收到以下消息 dyld Library not loaded rpath libcgunwind 1 0 dylib Referenced from Use
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 以 png 格式剪辑幻灯片 (Delphi 2010)

    I have a filmstrip of images in png format like this 我想知道如何剪辑每个图像并将这些图像放入 TImageList 控件中 并始终保留透明度 EDIT 是的 在设计时 RRUZ 提到的技
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 如何使用 Gmail 的 SMTP 和 Indy 10 发送电子邮件?

    我正在使用 Delphi 2009 和 svn 中最新的 Indy 10 通过 SMTP 发送电子邮件 但它不适用于 Gmail Google Apps 托管域 当我尝试发送电子邮件时 我收到 必须首先发出 STARTTLS 命令 我尝试用
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何使用 FieldDefs 在运行时创建新的 SQLite 文件和表?

    我正在使用 Delphi Seattle 在全新的 SQLite 文件中创建一个全新的表 并且仅使用 FieldDefs 和非可视代码 我可以使用 ExecSQL CREATE TABLE 语法创建一个表 但不能如下所示 我得到 没有这样的
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • Delphi 中表单分发与其生命周期相关的接口对象的安全方法?

    我有一个 Delphi 表单 它提供接口对象背后的功能 代码的其他部分也通过属于该表单的属性获取引用 我无法将接口功能委托给子对象 因为太多的功能是由表单上的控件 组件提供的 我无法使用 TAggregateObject 或 TContai
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

    是否可以将 TImage 放置在 iOS 的 FMX 表单上 并将图像 jpg 从 URL 加载到此 TImage 中以在 iOS 应用程序中显示 我尝试过但没有成功 任何正确方向的提示或指出都会受到赞赏 将 TButton TImageC

随机推荐

  • 如何在 Atom 中设置 jshint/jsxhint "esnext" 选项

    我正在使用 Atom 的linter react and linter jshint linter jsxhint 在我的 JSX 文件中 我不断收到警告 警告 导入 仅在 ES6 中可用 使用 esnext 选项 W119 这非常简单 我
  • C# 访问 EXCEL,将单元格格式设置为常规

    在 C 中操作 excel 单元格 通过 COM 对象 时 我应该使用 Value 还是 Value2 那是 sheet Cells row n col Value Hello world or sheet Cells row n col
  • 获取轴的纵横比

    有没有一种简单可靠的方法来确定当前纵横比axes当其方面设置为 auto 显而易见的是要检查的是ax get aspect 但这只是返回 auto 我可以将其设置为任意常数值ax set aspect aspect 之后返回相同的常量ax
  • 无法获取相机预览(调用相机),HTC Thunderbolt

    我是 Android 应用程序开发的新手 所以请任何答案都包含代码示例 我的问题是这样的 我必须开发一个相机应用程序 将 mjpeg 流式传输到服务器 现在我已经成功地为我的摩托罗拉 Atrix 创建了该应用程序 并且效果非常好 我的问题是
  • Play 的成功案例!框架? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Windows 7 x64 上的 Flash ocx“类未注册”

    我有一个在 32 位机器上开发的使用 Flash10c ocx 的 WPF 应用程序 我不必在我的开发机器上注册 ocx 我只需安装最新的闪存 添加引用并开始编码 在 64 位系统上测试时 我得到了旧的 类未注册 我认为这意味着我需要 re
  • 从线程更改 ui

    我知道有类似的问题 但我的问题略有不同 我有这样的代码 Thread t new Thread public void run while running if gpstracker canGetLocation double lon gp
  • 在 Android 中组合音频文件的最佳方式

    我正在开发录音应用程序 其中包括暂停 播放 option 我尝试过两者媒体记录器 and 录音带 的情况下录音带 录制的音频消耗更大的大小 因此如果录制大小增加 例如 如果我录制 1 分钟的音频消耗 40 到 50MB通过将其转换为 来进行
  • 如何在 build.gradle 中使用 gradle 属性

    当我运行这个任务时 task tmpTask lt lt project properties each println it I see org gradle java home usr lib jvm java 6 oracle 但如何
  • 连接两个字典[重复]

    这个问题在这里已经有答案了 给定一些字典 Dictionary
  • 在 websphere 8.5 上启动应用程序时出现异常

    我在 WebSphere 8 5 上启动 Web 应用程序时遇到此错误 应用程序通过 DB2 上的 MyBatis 存储过程进行调用 用户使用 REST WS 触发调用 使用 Jersey 框架实现 春天将一切粘合在一起 相同的应用程序在
  • 在JQuery中,设置新的CSS规则后是否可以获取回调函数?

    I have element css color yellow 我需要下一个事件只发生在这个事件之后 看起来像 element css color yellow function alert 1 我需要这个是因为 element css c
  • 做出这个推论需要什么?

    如果我想从这些事实推断 奥巴马出生在美国 Obama bornIn Hawaii Hawaii partOf USA 这两个事实足以做出推论吗 如果是 应该用RDFS还是OWL来表示事实 是否有一些在线 SPARQL 工具可以让我快速测试这
  • 获取包含 main 的 .class 文件的目录路径

    是否可以从 main 中获取包含 main 函数的 class 文件的路径 URL main Main class getResource Main class if file equalsIgnoreCase main getProtoc
  • PyTorch 中张量的最小-最大归一化

    我想在 PyTorch 中对张量执行最小 最大归一化 获得最小 最大归一化的公式是 我想使用一些方法对张量执行最小 最大归一化new min and new max 无需迭代所有元素张量的 gt gt gt import torch gt
  • RecyclerView + MediaPlayer + 切换按钮 + 字符串 Uri

    背景 我正在开发一款健身应用程序 到目前为止一切都运行良好 但是当我处理音频文件时出现了问题MediaPlayer在安卓中 我检查了资源并发现ListView但在 RecyclerView MediaPlayer 上找不到任何内容 我想知道
  • Wicked-PDF 不显示图像,'wicked_pdf_image_tag' 未定义

    我想生成一个包含我们部门徽标的 PDF 当我尝试在控制器中使用 WickedPdf 类时 使用中描述的方法 https github com mileszs wicked pdf https github com mileszs wicke
  • fs.unlink 不会删除文件

    在我的 Express 服务器上 我想获取用户上传的文件并将其重命名以匹配他们的用户名 如果用户上传新文件 则之前的文件将被替换 这是代码 var newPath uploads user username file extension t
  • 有什么方法可以在 Sql Profiler 或类似工具中获取 .net 堆栈跟踪吗?

    在我之前的工作中 我设计并帮助构建了一个运行时 生产 分析工具 http www samsaffron com blog archive 2007 05 11 15 aspx除了其他很酷的功能之外 它还能够为我提供每个执行的 SQL 语句的
  • Delphi - 为什么 TObject.InitInstance 是公共的?

    我对 Delphi 有点陌生 这个问题只是我好奇 我也只是偶然尝试使用它 结果发现我不应该这样做 如果您查看文档TObject InitInstance http docwiki embarcadero com Libraries XE4