首页
社区
课程
招聘
搞不懂new了 ~~~
发表于: 2005-5-5 02:54 7165

搞不懂new了 ~~~

2005-5-5 02:54
7165
.text:00401000 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401000 _main           proc near               ; CODE XREF: start+16Ep
.text:00401000                 push    1Ch                      //这里是PlayerInfo的信息  可是他怎么知道PlayerInfo的长度的呢
                                                                        又没用sizeof什么的函数计算过  怎么莫名奇妙就知道1cH?       
.text:00401002                 call    ??2@YAPAXI@Z    ; operator new(uint)
.text:00401007                 mov     dword_40A740, eax        //过完new PlayerInfo后  eax的地址总是不变  无论用od加载几次 就是没变过  不是说new是在堆里动态分配内存吗? 这里怎么不是动态的啊????
.text:0040100C                 add     esp, 4
.text:0040100F                 xor     ecx, ecx
.text:00401011                 mov     [eax], ecx
.text:00401013                 mov     [eax+4], ecx
.text:00401016                 mov     [eax+8], ecx
.text:00401019                 mov     [eax+0Ch], ecx
.text:0040101C                 mov     [eax+10h], ecx
.text:0040101F                 mov     [eax+14h], ecx
.text:00401022                 mov     [eax+18h], ecx

#include "stdafx.h"

#include "common.h"
PlayerInfo *pPlayer;

main()
{
pPlayer=new PlayerInfo;
ZeroMemory(pPlayer,sizeof(PlayerInfo));
while(true)
{
  system("cls");
   。。。

}
}

common.h:

struct PlayerInfo
{
int x;
int y;
int z;   //
int hp;
int hp_max;
int mp;
int mp_max;
};

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (16)
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
//怎么莫名奇妙就知道1cH?
这个工作应是编译器编译时完成的吧。
2005-5-5 09:27
0
雪    币: 217
活跃值: (99)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
//过完new PlayerInfo后  eax的地址总是不变  无论用od加载几次 就是没变过  不是说new是在堆里动态分配内存吗? 这里怎么不是动态的啊????

这个纯属巧合,不过想想也是必然的,每个进程空间都是独立的,不受其他进程内存使用的影响.因此相同OS的情况下分配的结果应该都是相同的.
2005-5-5 10:35
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
在别人机子上试了下 真的是这样的哦  

8过kanxue大大回答的就有点不够底气了  那个1cH真的是编译器算出来的吗?
2005-5-6 01:27
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
最初由 Nada 发布
在别人机子上试了下 真的是这样的哦

8过kanxue大大回答的就有点不够底气了


呵~说话习惯给自己留点退路。
2005-5-6 10:31
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
最初由 Nada 发布
在别人机子上试了下 真的是这样的哦

8过kanxue大大回答的就有点不够底气了 那个1cH真的是编译器算出来的吗?

Nada,这种问题完全可以自己解决的,翻翻MSDN,上google,百度搜索以下。
或者自己写一个实例反汇编一下,sizeof只是一个操作符,并非你说的是一个函数,你自己动手做一个就知道了,至于谁算出来的可能是编译器吧。。。
2005-5-6 10:48
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
7
个人愚见
1C是编译器预先算好的
new到的地址存在变化的可能
不变的是dword_40A740
2005-5-6 10:50
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
8
最初由 Nada 发布
在别人机子上试了下 真的是这样的哦

8过kanxue大大回答的就有点不够底气了 那个1cH真的是编译器算出来的吗?


当然是。
编译器根据你new时指定的类型分配内存。
PlayerInfor对象的内存布局也由compiler
确定。而且这里是个struct,与class还有
区别。

你可以看看<Inside C++ object model>。

2005-5-6 11:46
0
雪    币: 390
活跃值: (707)
能力值: ( LV12,RANK:650 )
在线值:
发帖
回帖
粉丝
9
1C是算的

不信你自己算算
2005-5-6 11:55
0
雪    币: 726
活跃值: (3334)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
不管你什么变量和结构,编译以后都是机器码,数据类型只是给你思维和给编译器来判断的.编译器可以通过类型信息来判断你的语法.保证逻辑正确,有时候还做适当的转换.
至于那个大小当然不在话下.给定了数据类型,只要编译起能找到合法的类型申明就可以计算出大小.他是根据它带的头文件里面的信息算出来的.
class和struct的区别并不大,主要就是多一个vtb,完成c++的this指针和virtual函数
2005-5-6 13:12
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
11
是算出来的,,当操作数不对齐的时候,,,编译器对齐大小也要包括一些编译器填充的字符...
2005-5-6 19:10
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
12
昨晚做梦听说:

无冬之夜 11:36:51
sizeof是个宏啊,哪里是函数,编译的时候就搞好了
2005-5-7 11:44
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
既不是函数也不是宏
2005-5-7 13:18
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
PlayerInfo 长度是固定的
2005-5-7 13:25
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
在win32里面每个程序都认为自己有4G的空间。
EAX的值并不是真正的地址,你怎么不问为什么程序都是0040000开始的呢?道理都是一样的。
我说的可能不对,好清高手指教!
2005-5-7 13:29
0
雪    币: 207
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
0040000 好象书里有讲过  是系统建议装入的地址吧
很多地方都有看到   所以就不问了  好象懂了 从2楼谢到15楼~
2005-5-7 16:59
0
雪    币: 216
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
哈哈,你真是一泻千里阿
2005-5-7 17:18
0
游客
登录 | 注册 方可回帖
返回
//