为什么 object 不默认为零?

2023-12-23

在 Delphi 中,从 TObject 继承的变量的记录行为是默认值 nil。然而,我遇到过一种情况,情况并非如此。

通过 IDE (F9) 运行以下代码示例会产生混合结果

var
  objTemp : TMemDataSet;
begin
  if (objTemp = nil) then
     ShowMessage('Nil');
end;
  • 32 位/调试模式,不默认为零
  • 32位/释放模式,不默认为nil
  • 64 位/调试模式,is默认为零
  • 64位/Release模式,不默认为nil

我的理解是该值应始终默认为零。

在XE2和XE5下也进行了测试,结果相同。

这是 Delphi 中的预期行为吗?


你的理解是不正确的。非托管类型(IOW,非引用计数类型)的局部变量未初始化。您必须先为它们分配一个值,然后才能使用它们。

来自XE5文档 http://docwiki.embarcadero.com/RADStudio/XE5/en/Variables(参见“声明变量”部分的底部 - 我在 Wiin32 中包含了类型拼写错误,但重点是我的):

如果你没有显式初始化全局变量,编译器 将其初始化为 0。对象实例数据(字段)也是 初始化为0。在 Win32 平台上,本地的内容 变量在被赋值之前是未定义的。

请注意,每当 Emba 写入“Win32”时,它们都表示非 ARC 编译器,因此上述内容也适用于 Win64 和 OSX。

您可以通过在帮助索引中使用搜索词“变量”在 Delphi 2007 中找到相同的信息;它是“变量 VBScript”和“变量 [OpenGL]”之间的一个。

您在 Win64 调试版本中看到的差异可能只是编译器完成的操作、幸运的意外或完全是其他原因。不过,这应该不重要。正如您所知,局部变量默认情况下不会初始化,只需确保在使用它们之前在所有情况下都这样做即可。这并不是一条很难执行的规则;当你声明一个局部变量时,

var
  MyObj: TSomething;

您要么自己分配一个值,要么从代码中的其他地方收到一些值:

MyObj := TSomething.Create;   // Created yourself
MyObj := GetSomething();      // Function result
MyObj := Self.SomethingCollection[Self.SomethingCount - 1]; // Local ref

绝对没有理由需要依赖于是否初始化局部变量,因为可以在分配给局部变量之前对外部引用进行测试,也可以在分配外部引用之后对局部变量进行测试:

if SomethingIGot = nil then
  raise Exception.Create('Received a nil parameter');
MyObj := SomethingIGot;

// or

MyObj := SomethingIGot;
if not Assigned(MyObj) then
  raise Exception.Create('MyObj was assigned a nil value');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 object 不默认为零? 的相关文章

  • 如何更新Delphi对象检查器?

    继我最近发布的这个问题之后 组件编辑器可以在多个组件上执行吗 https stackoverflow com questions 14802371 can a component editor be executed on multiple
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • 在运行时创建 TQReport 元素

    在运行时创建 TQReport 元素 嗯 至少尝试一下 我不知道这份报告中应出现哪些标题或数据 我得到一个代表数据行和列的 TString 的 TList 我在组的带打印事件中植入 创建 指令 并在主数据行带的 OnNeedData 事件中
  • 如何在 Vista 上安装 Delphi 7

    我多次尝试在 Vista 上安装 Delphi 7 但 Vista 告诉我此应用程序 Delphi 7 存在已知问题 从而阻止了我这样做 我公司的其他几个人在 Vista 上安装 D7 时遇到了问题 由此得出的结论是 我们的 D7 应用程序
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • 如何仅在调试模式下激活 ReportMemoryLeaksOnShutdown?

    我需要激活ReportMemoryLeaksOnShutdown报告应用程序内存泄漏的功能 但仅限于调试模式 当 Delphi IDE 运行时 我怎样才能做到这一点 如果您的意思是使用调试构建配置 D2007 编译的 调试模式 则您将定义
  • Indy 的 TIdHTTPProxyServer:如何过滤请求?

    我正在使用 TIdHTTPProxyServer 来实现一个简单的 HTTP 代理 但我现在想阻止一些与某些 URL 匹配的连接 哪个事件和 或组件最适合实现这一目标 Indy 文档并没有太多解释 Thanks 作为基本过滤器 您可以使用
  • 开源 Delphi 包可使用哪些项目选项?

    我写了一些 Delphi 代码 想在 GitHub 上分享 所有代码都根据需要包含在运行时和设计时包中 每个项目有许多项目选项需要设置 输出目录 搜索路径 编译选项等 我设法找到了一些适合我的情况的默认选项 但阅读此处的其他问答很明显有多个
  • TDictionary 上的 GetItem 由链接器消除

    我正在使用一个TDictionary of
  • Delphi 返回 TList 时出错

    我做了一个非常简单的应用程序 但我有一个我真的无法理解的问题 看一下这个基本代码 unit Unit1 interface uses Winapi Windows Winapi Messages System SysUtils System
  • 具有 csOwnerDrawFixed 样式的组合框如何表现得像 csDropDown 样式?

    我正在使用一个组合框 http docwiki embarcadero com Libraries en Vcl StdCtrls TComboBoxstyle 属性设置为的组件csOwnerDrawFixed 我实现了绘图项一切工作正常
  • 为什么 {$ifopt FINITEFLOAT ON} 无法编译?

    我有这样的构造 ifopt FINITEFLOAT ON message FINITEFLOAT option ON else message FINITEFLOAT option OFF endif 在我的源代码中 它不会编译 这一定是一
  • TObjectList.Contains 导致 Delphi 2009 中的访问冲突

    在 Delphi 2009 中 到目前为止 我在泛型方面没有遇到大问题 使用 Generics Collections 列表 没有特殊的泛型功能 现在我发现这段代码会在访问的行中导致AVMyList Contains 如果我声明 TMyLi
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • EOutOfMemory 使用 Delphi 创建大型 XML

    我正在使用 Delphi 从关系数据库中的数据创建 XML 文档 它在小数据集上测试得很好 但是当我尝试将数据集的大小扩展到生产级别时 它最终在节点创建期间因 EOutOfMemory 异常而崩溃 我正在使用放在表单上的 TXMLDocum
  • 在 Delphi 中的 SOAP 标头中发送简单字符串

    我需要发送这样的东西
  • Delphi 将面板流传输至文件

    今天我有一个关于将表单的一部分流式传输到文件的问题 在此示例中 我使用 Tmemo 而不是文件来查看流 这是我的表格 表单右上角的面板有一些控件 如标签 编辑等 使用 保存面板 按钮将面板保存在 TStream 上 这里是代码 proced
  • 可以在滚动条上绘画吗?

    是否可以在 TMemo TListbox 等标准控件的滚动条上进行绘制 我所需要的只是在滚动条上绘制一些基本形状 并且我试图避免从 stratch 实现整个滚动内容 有什么指点吗 蒂亚 确实有可能 你可能想看一下WM NCPAINT消息 这
  • 将delphi stringgrid导出到excel

    我正在尝试将数据从delphi 7 中的stringgrid 导出到microsoft excel 我一直在使用这段代码来做到这一点 objExcel TExcelApplication Create nil objExcel Visibl
  • delphi THashSHA2 在大文件上返回错误的 SHA256

    Data Cloud CloudAPI pas has class function TCloudSHA256Authentication GetStreamToHashSHA256Hex const Content TStream str

随机推荐