加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 09:44:28 所属栏目:大数据 来源:网络整理
导读:我有以下代码序列: program OverrideAfterConstructionEtc;{$APPTYPE CONSOLE}uses SysUtils,Classes;typeTA = class( TInterfacedObject)publicprocedure AfterConstruction; override;procedure BeforeDestruction; override;protectedFDummyData: array[
我有以下代码序列:

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是隐式参数,是对接收方法调用的实例的引用.它被实现为指针.

Addr标准程序与@运算符相同;它需要传递给它的位置的地址.将Addr应用于Self时,您将获取参数位置的地址,而不是实例的地址.此参数位置在堆栈上分配,因为它只需要在方法调用处于活动状态时存在;当方法调用返回时,不再需要Self参数的空间;它被隐式释放,由CPU的堆栈指针移回到调用方法之前的状态.

Self参数可能位于同一实例上的方法的不同调用中的不同位置的原因是因为在调用时堆栈上可能存在更多或更少的数据.例如,如果方法调用序列看起来像A – >,则将以不同方式分配Self参数. B – > C与A – > C,因为B的堆栈帧需要存储在A和C的堆栈帧之间.堆栈帧是分配与方法的任何给定调用相关联的参数和本地的位置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读