gpt4 book ai didi

delphi - 在Delphi 7中获取对象的分配地址

转载 作者:行者123 更新时间:2023-12-03 15:15:08 25 4
gpt4 key购买 nike

我有以下代码序列:

program OverrideAfterConstructionEtc;

{$APPTYPE CONSOLE}

uses
SysUtils, Classes;

type

TA = class( TInterfacedObject)
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
protected
FDummyData: array[ 1 .. 1000 ] of longint;
end;

{ TA }

procedure TA.AfterConstruction;
var
selfPtr: Pointer;
selfInt: Integer;
selfStr: string;
size: Integer;
begin
inherited AfterConstruction;
selfPtr := Addr( self );
selfInt := Integer( selfPtr );
selfStr := IntToHex( selfInt, 8 );

size := TA.InstanceSize;
WriteLn( 'TA instance allocated at 0x', selfStr );
WriteLn( 'TA size is ', size );


end;

procedure TA.BeforeDestruction;
var
selfPtr: Pointer;
selfInt: Integer;
selfStr: string;

size: Integer;

begin

selfPtr := Addr( self );
selfInt := Integer( selfPtr );
selfStr := IntToHex( selfInt, 8 );

WriteLn( 'Preparing to destroy TA instance allocated at 0x', selfStr );

size := TA.InstanceSize;
WriteLn( 'TA size is ', size );

inherited BeforeDestruction;
end;

const
maxDummy = 1000;
var
a: TA;
dummy: TList;
iter : integer;

dummies: array [ 1 .. maxDummy ] of TList;
begin

// Simulate a set of allocations.

for iter := 1 to maxDummy do
begin
dummy := TList.Create;
dummies[ iter ] := dummy;
end;

// Allocate the object we want to track.
a := TA.Create;

// Release the simulated allocations.
for iter := 1 to maxDummy do
begin
dummy := dummies[ iter ];
dummies[ iter ] := nil;
FreeAndNil( dummy );
end;



// Release the tracked object.

FreeAndNil( a );

end.

代码的输出是:

  • TA实例分配在0x0012FF88
  • TA 大小为 4012 准备销毁
  • TA实例分配在0x0012FF80
  • TA 尺寸为 4012

我不明白“ self ”的区别。你能给我一个提示吗?我希望打印的值是相同的。

最佳答案

实例方法中的

Self 是一个隐式参数,并且是对接收方法调用的实例的引用。它是作为指针实现的。

Addr标准过程与@操作符相同;它获取传递给它的位置的地址。当您将 Addr 应用于 Self 时,您将获取参数位置的地址,而不是实例的地址。该参数位置分配在堆栈上,因为它只需要在方法调用处于事件状态时存在;当方法调用返回时,不再需要 Self 参数的空间;它通过 CPU 的堆栈指针移回到调用该方法之前的位置来隐式释放。

在同一实例上的不同方法调用中,Self 参数可能位于不同位置的原因是因为调用时堆栈上可能有更多或更少的数据。例如,如果方法调用顺序类似于 A -> B -> CA -> C,则 Self 参数的分配方式会有所不同,因为 B 的堆栈帧需要存储在 AC 的堆栈帧之间。堆栈帧是分配与任何给定方法调用关联的参数和局部变量的位置。

关于delphi - 在Delphi 7中获取对象的分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4670594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com