面向对象语言的new操作

 

下面是一段简单的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

                       深入C++的new

 

我们知道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

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值