今天在测试程序测试的过程中,发现用new运算符申请空间失败,跟踪并分析了一下new的源码
1. operator new[]的代码
void *__CRTDECL operator new(size_t) /*_THROW1(std::bad_alloc)*/; void * operator new[]( size_t cb ) { void *res = operator new(cb); RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0)); return res; }
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); // #define _RAISE(x) ::std:: _Throw(x) 抛出nomem的异常 } return (p); }问题1: 原本我们的理解是,利用new运算符去创建对象,会做如下工作:
申请内存空间
调用对象的构造函数初始化对象
返回对象类型的指针
调用对象的构造函数初始化对象
返回对象类型的指针
但是我们在源码中发现new中只是做了申请内存空间的工作,
那构造函数的调用,以及指针类型的转换,是在哪里做的?由谁做的?
问题2:
在C++中,运算符和函数究竟有什么区别?
我理解的,运算符本身是语言本身自带的,不能自定义运算符,而函数是由用户自定义的。
运算符可以重载,函数也可以重载
只想到这么些了。
new是C++的操作符,你调试的只是new操作符的第一部分调用new函数进行空间分配,第二部分是对对象调用构造函数(是指类类型)。
我想这也是为什么new叫做一个操作符,而不作为一个函数的原因。因为如果new仅仅是一个函数调用,那么他只能做到申请空间,而无法在new函数内实现类对象的构造函数调用。
另外看下测试结果,其中base为类类型:
首先,new运算符肯定不只是申请空间,不然直接malloc不就行了
new除了申请空间外,还标明所申请空间存放的对象类型,然后编译器会查找对应类型的构造函数,对空间进行初始化
友情互访,你懂的!http://blog.csdn.net/crazyingBird