- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们正试图弄清楚我们的软件中是否存在内存泄漏。所以,我一直在使用各种工具和程序来帮助我找到可能的内存泄漏。我使用的软件之一是 AQTime。由于它与 Delphi XE 一起提供,它只是一个演示。所以,我真的无法从中获得任何有用的信息。然后,我决定使用免费软件 MemProof。到目前为止,它向我展示了我们软件的许多需要注意的问题。其中之一是错误。
一旦我通过 MemProof 启动我的程序,它就会列出 2 个错误,即试图从单元文件 system.pas 中销毁不存在的对象。因此,当我实际上在 TObject.Free 过程中放置一个断点时,它甚至在我的程序一直启动之前就中断了。通过 system.pas 中的 Free 过程,我发现 TIconimage 正在尝试破坏或释放自身。换句话说,在实际启动之前,不会从我的程序中调用免费过程。
这是实际的免费程序:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
最佳答案
关于为什么TObject.Free
执行很多,每次销毁一个对象时,任何对象都会调用该方法。所有的类都派生自 TObject,它是共同的祖先,所以 Delphi 程序中的几乎任何 Action 都涉及大量的对象创建/销毁对,因此会命中 TObject.Free
.
关于内存泄漏的检测,您需要在 Delphi 中内置来解决这个问题。 FastMM 内存管理器可以在“报告内存泄漏”模式下运行,它会为您提供任何内存泄漏的诊断负载。
考虑以下简单的程序:
program Leaker;
begin
ReportMemoryLeaksOnShutdown := True;
TObject.Create;
end.
ReportMemoryLeaksOnShutdown
在您的应用程序中的某处设置为 True(.dpr 文件的开头与任何地方一样好)。
A memory block has been leaked. The size is: 84
This block was allocated by thread 0x1304, and the stack trace (return addresses) at the time was:
40455E [System][System.@GetMem]
405A2F [System][System.TObject.NewInstance]
40602E [System][System.@ClassCreate]
4474C2 [Classes][Classes.TStringList.Create]
C275A3 [Main.pas][Main][Main.TMainForm.CreateAuxiliaryForms][997]
C84C8A [OrcaFlex.dpr][OrcaFlex][OrcaFlex.OrcaFlex][351]
75E633CA [BaseThreadInitThunk]
77519ED2 [Unknown function at RtlInitializeExceptionChain]
77519EA5 [Unknown function at RtlInitializeExceptionChain]
The block is currently used for an object of class: TStringList
关于delphi - 为什么在执行我的应用程序的第一行代码之前调用 TObject.Free?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5331783/
我刚读 "Any class that implements the IEqualityComparer interface is expected to provide the implementa
我一次又一次地看到使用 Func 的 API(尤其是在 .NET 框架中)什么时候Predicate似乎是一个完全负责任的选择。 API 设计者这样做的好理由是什么? 最佳答案 在 LINQ 中,Fu
我目前正在考虑一个场景,我想要一个通用类,它在其项目上调用 Free IF 这些都是对象类型。所以我尝试了以下方法: if (PTypeInfo (TypeInfo (T)).Kind = tkCla
我有一个过程需要 TObject 类型的参数,如下所示: MyProcedure (const AValue : TObject); 我有一个 Variant 数组,我正在循环调用该过程,如下所示:
(发件人:TObject)是什么意思?如: procedure TForm1.Button1Click(Sender:TObject); var s: Integer; begin ..... ...
TObject.InstanceSize 返回 8,但 TObject 未声明任何数据成员。根据TObject.ClassType的实现,前4个字节可以解释为指向对象的TClass元数据的指针。有人知
我们正试图弄清楚我们的软件中是否存在内存泄漏。所以,我一直在使用各种工具和程序来帮助我找到可能的内存泄漏。我使用的软件之一是 AQTime。由于它与 Delphi XE 一起提供,它只是一个演示。所以
如何将当前状态的对象保存到文件中?这样就可以立即读取并恢复它的所有变量。 最佳答案 您正在寻找的称为对象持久性。这个article可能会有所帮助,如果你用谷歌搜索“delphi持久对象”,还有很多其他
我正在 Delphi XE2 中编写一个支持触摸屏的应用程序。 我有一个带有 TEdits 的表单。当我单击它们时,我调用我编写的过程来显示另一个最大化的始终位于顶部的窗体,其中带有带有标签(用于标题
我似乎无法通过搜索找到答案,所以这里...... 我知道我可以通过使用这种类型的代码将 Class 对象一般地传递给其他类: public class ClsGeneric where TObje
请了解此代码: type TClient = class(TObject) public Host: String; Queue: TIdThreadSafeStringLis
想使用 Sender 作为 TObject 作为我的案例的选择标准...声明 procedure TForm.ShowGUI (Sender: TObject); begin case sende
基于之前的一个答案 post ,我正在研究以下设计的可能性 TChildClass = class(TObject) private FField1: string; FField2: s
我试图使用下面的代码将 TObject.AfterConstruction 重定向到另一个过程,但一段时间后开始出现很多异常。注意:我使用这种重定向到许多其他解决方案。 unit Unit109; i
这里是一些示例代码,它是 Delphi 中的一个独立控制台应用程序,它创建一个对象,然后创建一个 TInterfacedObject 对象,并将 Interface 引用分配给 TObject 中的字
我怎样才能让我的代码工作? :) 我试图提出这个问题,但经过几次失败的尝试后,我认为你们通过查看代码会比阅读我的“解释”更快地发现问题。谢谢。 setCtrlState([ memo1, edit1,
我有一个需要返回一个对象的方法。当然,只有当 T 是一个对象时才有意义: function TGrobber.Swipe: TObject; var current: T; begin
看看这个类: TTest = class(TObject) public constructor Create(A:Integer);overload; constructor Crea
除此之外post其接受的答案仍然非常神秘: @Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) be
目前Delphi XE只能在我的盒子上使用,我不知道Delphi 2010/XE2是否引入了一些突破性的变化。 请帮我更新以下定义: TVmt = packed record SelfPtr
我是一名优秀的程序员,十分优秀!