为什么在销毁对象后使用该对象时没有收到异常?

2023-12-08

下面的代码工作得很好,但它不应该!当我单击 Button1 时,该对象首先被销毁,然后使用其值,并且我没有收到任何访问冲突或其他内容...更重要的是,乘法运算给出了正确的结果,这证明了Obj1没有被毁掉!但话又说回来,这也不是真的,因为当我关闭程序时,它不会报告任何内存泄漏。我很困惑。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  MyObj = class(TObject)
   Value: Cardinal;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  public
   Obj1:MyObj;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Obj1.Free;
 Obj1.Value:=Obj1.Value * 5;
 Caption:=IntToStr(Obj1.Value);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ReportMemoryLeaksOnShutdown:=true;
 Obj1:=MyObj.Create;
 Obj1.Value:=10;
end;

end.

物体被破坏。内存返回给内存管理器。接下来发生的事情是你无法控制的。内存可以返回给系统。在这种情况下,您会看到运行时错误。或者,内存管理器可以使内存保持活动状态,以便在下次程序请求该大小的块时重用。这就是这里发生的情况。

您的程序表现出未定义的行为。任何事情都可能发生,包括程序看起来有效。显然这个程序是错误的,你不能在对象被销毁后访问它们。

如果您使用 FastMM 的完整调试版本,那么您应该会看到错误,因为在这种情况下,会采取步骤来检测释放后的访问。这是一个有用的调试工具。

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

为什么在销毁对象后使用该对象时没有收到异常? 的相关文章

  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • Delphi如何使用其他窗体中的类型?

    抱歉 这是一个非常新手的问题 我正在对这个庞大的应用程序进行维护 它有5种不同的形式 我们将全局变量放在一个单元 uGlobal 中 但我似乎无法从数据单元 uData 访问它 我有这个 Unit uGlobal type TmyType
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • Delphi中的抽象类

    我正在使用一个具有许多抽象类的组件套件 现在我想应用多态性 但在创建对象时收到错误抽象类 即使我不需要 我是否应该重写所有虚拟方法 有什么解决方法或解决方案吗 为了创建类的实例 您需要重写所有声明为虚拟抽象的方法 即使您不使用它们 如果您确
  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • HDF5 库错误

    我正在使用以下 1 VS 2010 C 2 调试Win 32 3 图书馆从这里 http www hdfgroup org HDF5 release obtain5 html http www hdfgroup org HDF5 relea
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • 查找Delphi项目中的所有编译错误

    我正在对我的 Delphi 项目进行一些重构 我希望能够做出改变 然后看看all项目中因该更改而中断的地方 类似于 Eclipse 列出项目的所有编译错误 在 Java 中 在 Delphi 中 我可以进行更改 然后重新编译我的项目 但编译
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 如何在iOS的Delphi程序中使用IPv6协议

    我尝试在我的移动程序中使用 IPv6 协议 我的服务器位于 NAT 后面的 LAN 内 在服务器上我使用IP端口3000 我已经组织了从路由器端口 45500 到服务器端口 3000 的虚拟服务器 端口转发 在服务器上 我运行 ipconf
  • 在 Delphi 或 C++ Builder 中使用 Chromium Edge WebView2 [重复]

    这个问题在这里已经有答案了 既然 Microsoft Chromium Edge 已经最终确定 是否可以在 Delphi 或 C Builder 中使用它 据我了解 它是基于WebView2成分 是否有一个组件 例如TWebView2或者E
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • FireMonkey iOS RAD Studio XE2 - 在从 URL 加载的表单上显示图像

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

随机推荐

  • .NET,每分钟都有事件(每分钟)。计时器是最好的选择吗?

    我想使用 C 在 Windows 窗体应用程序中每分钟 按时钟 做一些事情 我只是想知道最好的方法是什么 我可以使用计时器并将其间隔设置为 60000 但要让它按分钟运行 我必须精确地按分钟启用它 这不太可行 我可以使用计时器并将其间隔设置
  • java.lang.SecurityException:权限拒绝:实现内容提供程序时打开提供程序

    我有问题 我尝试在我的消费者应用程序中实现内容提供程序 这是我来自应用程序 A 提供商 的 Android 清单
  • 以相反顺序打印 bash 参数

    我必须编写一个脚本 它将接受所有参数并反向打印它们 我已经提出了解决方案 但发现它非常糟糕 你有更聪明的主意吗 bin sh gt tekst txt for i in do echo i cat tekst txt gt temp mv
  • spring 3.0 MVC 似乎忽略 messages.properties

    Spring 3 0 MVC 首先 我没有找到任何有关 messages properties 的文档泉源我在各种论坛上发现了有关覆盖错误消息的所有内容 如果有人能参考 messages properties 的记录位置 那就太棒了 也许
  • MVC 3 和 DRY 自定义验证

    除非我遗漏了一些东西 这很有可能 否则在我看来 自定义验证总是违反 DRY 的 在我见过的所有示例中 即使使用 MVC 3 引入的全新非侵入式客户端验证 我们也必须为服务器端验证创建 NET 代码 并为客户端验证创建 jQuery 或 Ja
  • 我应该使用 HTML5 和 CSS3 吗?

    我是一个想要了解最新网络技术的人 但也很感激很多人仍然使用 IE6 7 8 如果一半内容在大多数浏览器上都无法显示 这是浪费代码 时间吗 这只是使用不同样式表的情况 还是只使用一个样式表 如果浏览器不支持文本阴影 那就搞砸了 他们可以看到它
  • 左填充猪中的一根绳子

    我想用 0 s 填充字符串数据类型字段 有什么办法可以做到这一点吗 我需要有固定长度 40 值 提前致谢 千里眼 零的数量需要根据剩余字符串的长度动态生成 所以我认为这在本地猪中是不可能的 这在 UDF 中是很有可能的 输入 txt 111
  • 在 Angular 2 中使用 Typescript 选择输入中的文本

    我正在尝试准确地执行中所描述的操作这个帖子 但是在 Angular2 中 基本上都是使用javascript函数 setSelectionRange start end 在用户单击触发器后的输入中 我找不到任何方法来使用 Typescrip
  • 如何将图片绘制到闭合曲线区域

    你好 我想在 onDraw Canvas canvas 中将图像的一部分绘制到闭合曲线上 我已经使用以下代码绘制了一条闭合曲线 油漆 setColor 颜色 红色 油漆 setAlpha 80 canvas drawPath turnpag
  • C++ #include 未找到

    当我在 Visual Studio Express 中编译 C 程序时 它说找不到atlbase h 我是否缺少一些 SDK 或者其他东西 视觉工作室 2017 When running the Visual Studio Installe
  • 基于表单的网站身份验证的权威指南[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 版主注 这个问题不太适合我们的问答格式话题性规则目前适用于 Stack Overflow 对于内容
  • 如何访问FlipView内DataTemplate内的xaml控件

    我想访问 C 代码中的 图像 元素 我知道我无法直接访问它 因为它位于数据模板中 我已经尝试过视觉树 但仍然无法在代码中获取 图像 控制元素
  • 如何在 VS 负载测试之前设置 JWT 令牌

    我正在尝试运行 Visual Studio 负载测试 但在运行之前 我必须调用登录 webAPI 来生成 JWT 令牌 然后在所有 webAPI Web 测试中使用此令牌 我只需要调用一次登录即可生成令牌 我的所有其他 webAPI 调用中
  • 如何在.NET中不使用乘法运算符来实现乘法[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我想在 NET中实现两个整数的乘法而不使用乘法运算符 public uint Multi
  • 写入我的临时文件的权限被拒绝

    我正在尝试使用 Python 在 Windows 操作系统上创建并写入临时文件 我已经使用了Python模块tempfile创建一个临时文件 但是当我去写入临时文件时出现错误Permission Denied 我不允许写入临时文件吗 难道我
  • android.database.sqlite.SQLiteException:靠近“Group”:语法错误(代码1):

    Error Caused by android database sqlite SQLiteException near Group syntax error code 1 while compiling create table Grou
  • C#/Native:使用 SCSI PassThrough 读取 HDD 串行

    我编写了三种利用本机的不同方法CreateFile and DeviceIoControl调用以检索 HDD 序列号 而不是型号 第一个使用S M A R T 第二个使用Storage Query第三个使用SCSI PassThrough
  • JSF 标签未呈现[重复]

    这个问题在这里已经有答案了 我正在启动一个 JSF 项目 这是我第一次使用 JSF 并且在呈现标签时遇到问题 我正在 Eclipse 中进行开发并使用 TomCat 作为服务器 我的login jsp 文件 https gist githu
  • 无法加载包“Microsoft.Net.Native.SharedLibrary-x64”

    我要更新Microsoft NETCore UniversalWindowsPlatform但它显示一个错误 Unable to load package Microsoft Net Native SharedLibrary x64 如果我
  • 为什么在销毁对象后使用该对象时没有收到异常?

    下面的代码工作得很好 但它不应该 当我单击 Button1 时 该对象首先被销毁 然后使用其值 并且我没有收到任何访问冲突或其他内容 更重要的是 乘法运算给出了正确的结果 这证明了Obj1没有被毁掉 但话又说回来 这也不是真的 因为当我关闭