[求助] 如何得到对象的大小,我写的代码返回的结果不正确 ( 积分: 100 )

  • 主题发起人 主题发起人 doubeye
  • 开始时间 开始时间
D

doubeye

Unregistered / Unconfirmed
GUEST, unregistred user!
最近看delphi的语言手册,看到内存管理中有一段介绍类类型的虚拟方法表,其中位移值为-28为对象大小的字节表示(字节为单位),我如何能得到这个值呢
我写的代码如下:
TMarkwork = Class(TObject)
//具体声明略掉了
End;

Var
p : ^Cardinal;
size : Integer;
markwork : TMarkWork;
Begin
markwork := TMarkwork.create();
//一些操作被省略
p := @markwork;
dec(p,7);
size := p^;
showmessage(inttostr(size));
End;
每次的到的大小都不一样,是不是我那里写错了啊,哪个大哥能帮忙指教一下,谢谢了
 
要得到对象的大小可以用RTTI信息返回就可以了...
 
对象本就有个InstanceSize属性,你看它的源代码
class function TObject.InstanceSize: Longint;
begin
Result := PInteger(Integer(Self) + vmtInstanceSize)^;
end;
// vmtInstanceSize = -40;
// vmtAfterConstruction = -28 deprecated
// use VMTOFFSET in asm code instead
 
请问应该如何查看啊,我刚开始学习delphi,能不能具体一点,谢谢
 
看得出楼主对Delphi 的RTTI机制还是有看过的, 但方法不对."属于访问非法内存了",所以每次的值可能不同,但不一定每只都是. 你还是参考 轻舞肥羊 的答案吧, 这是Delphi提供的标准方法, 如果你要得到一个精确的大小. 比如指针? 需要自己计算
 
我刚才试了 轻舞肥羊 兄弟的方法,每次的到的大小都是36,可是这个对象包含一个TDataset,在向其中加入一条,数据后用windows的任务管理器查看时发现内存增长了进4MB,有点晕了,还请大哥帮忙解释一下,另外不知道各位有没有用过AQTime啊,据说很强大,不过不会用
 
>>这个对象包含一个TDataset
实际上,你那个对象只是包含了一个TDataSet的指针而已,算是一个引用,不会计算到你的对象占用的空间里的
 
再次感谢 轻舞肥羊 兄弟了,不知道能不能加一下你的MSN或者是QQ,因为现在这个项目遇到了内存泄露问题,可能有好多地方要请教,希望能方便的想兄弟学习。
继续这个问题:如果我想得到这个东西的实际大小,就要把他的所有包括的子对象的大小都计算出来了吧,这样做应该不太现实啊
 
对了,我的QQ是99762270,MSN是doubeye@sina.com
 
去网上找个叫FastMM4的东东,帮助你查找内存泄露的问题
今天完了就回老家了,不能上网~

其实管理好内存很简单,遵守一个原则,谁申请谁释放 就可以了,每个对象管好自己申请的内存,不要到别人那插一脚帮它释放什么的
 
我这里的人也是这么说的,可是我的类太复杂了,当时我建立对象的时候没有分割好,不过还是谢谢了,其实我也要回家了,准备把本本带家里继续研究,呵呵,可惜少了一个高人指点
 
当时我的类没有分割好,搞到现在太复杂了,准备过年把本本带回家研究,其实重新写应该就可以了,不过不甘心啊,想趁这个机会好好学习一下
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部