面向对象语言的new操作
2011-10-14 11:32 澜心 阅读(605) 评论(0) 编辑 收藏 举报下面是一段简单的C++代码,分下一下new操作符究竟干了一些什么。
- class Person
- {
- public:
- Person(){}
- ~Person(){}
- int name;
- int age;
- };
- class son:public Person
- {
- public:
- son(){}
- ~son(){}
- int toy;
- };
- Person * p= new Person();
- p->name = 44;
- p->age = 30;
- Person* s = new son();
- s->name = 44;
在new的地方,我们按f11跟踪进去。new是封装malloc,按照对象的大小申请内存。我们看到size是8,正好等于person中2个int的大小。
- void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
- { // try to allocate size bytes
- void *p;
- while ((p = malloc(size)) == 0)
- if (_callnewh(size) == 0)
- { // report no memory
- static const std::bad_alloc nomem;
- _RAISE(nomem);
- }
- return (p);
- }
那malloc又做了些什么操作呢。调用了 dbgmalloc.c 和dbgheap.c.
- extern "C" _CRTIMP void * __cdecl malloc (
- size_t nSize
- )
- {
- void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
- RTCCALLBACK(_RTC_Allocate_hook, (res, nSize, 0));
- return res;
- }
extern "C" void * __cdecl _nh_malloc_dbg (
- size_t nSize,
- int nhFlag,
- int nBlockUse,
- const char * szFileName,
- int nLine
- )
- {
- int errno_tmp = 0;
- void * pvBlk = _nh_malloc_dbg_impl(nSize, nhFlag, nBlockUse, szFileName, nLine, &errno_tmp);
- if ( pvBlk == NULL && errno_tmp != 0 && _errno())
- {
- errno = errno_tmp; // recall, #define errno *_errno()
- }
- return pvBlk;
- }
没有深究,有时间补上,有研究的童鞋请赐教
参考文章:http://blog.csdn.net/hejinjing_tom_com/article/details/4059711
我们知道new操作要调用对应的构造函数,可是我们在new操作的代码中并没有看到调用构造函数的任何代码,我们被书忽悠了?
那构造函数又是什么时候调用的呢。
请参考
一件被误导很久的事:关于new和delete
点击debug菜单window中的disassembly,查看汇编代码,很容易找到如下代码
Person * p= new Person(); 00171860 push 28h 00171862 call operator new (17131Bh) 00171867 add esp,4 0017186A mov dword ptr [ebp-1A0h],eax 00171870 mov dword ptr [ebp-4],1 00171877 cmp dword ptr [ebp-1A0h],0 0017187E je test+103h (171893h) 00171880 mov ecx,dword ptr [ebp-1A0h] 00171886 call Person::Person (1713B6h) 0017188B mov dword ptr [ebp-1CCh],eax 00171891 jmp test+10Dh (17189Dh) 00171893 mov dword ptr [ebp-1CCh],0 0017189D mov eax,dword ptr [ebp-1CCh] 001718A3 mov dword ptr [ebp-1ACh],eax 001718A9 mov dword ptr [ebp-4],0FFFFFFFFh 001718B0 mov ecx,dword ptr [ebp-1ACh] 001718B6 mov dword ptr [ebp-20h],ecx p->name = "44";
对比C++代码,在 Person * p= new Person(); 和p->name = "44"中间的应该就是new运算符对应的汇编。
gussing 写道
对类a的构造函数的调用,是编译器偷偷在你的函数里插入的,当时的情况就是如此。delete的情况也是一摸一样。
我们分析对构造函数的调用应该是编译器插入的。 至于怎么插入的,现在还不太明白。
参考文章:http://hi.baidu.com/linx214/blog/item/62251ace1f970e35f8dc6116.html
这个没有找到原帖,抱歉。
子类是怎样调用父类的成员函数的 http://blog.csdn.net/wishfly/article/details/5030381
C++:从子类访问父类的私有函数 http://hi.baidu.com/structureit/blog/item/3b041f6d86945af64216940c.html
http://campolake.iteye.com/blog/1195685
原文地址:
http://campolake.iteye.com/blog/1195685