您的位置:首页 > 编程语言 > C语言/C++

关于new和delete的编译器的内部实现---来自深度探索C++对象模型

2014-06-16 21:45 381 查看
对于new运算符的使用:int *pi = new int(5); 看起来似乎是一个单一运算,但实际上是由两个步骤完成的:

   1、通过适当的new运算符函数实例,配置所需的内存:

           int *pi = __new( sizeof(int) );

   2、将配置来的对象设立初值:

           *pi = 5;

new运算符的是先分配内存,内存分配成功后才执行初始化。

 

    对于用new创建一个类对象也是,先分配类大小的内存,然后调用构造函数进行初始化。这里有一个疑问,当构造函数抛出异常时怎么办?编译器是这样做的:

Object *p = new Object();  //编译器转化为
Object *p;
if( p = __new( sizeof(Object) ) )
{
try
{
p = Object::Object(p);
}
catch(...)
{
__delete(p);

throw;
}
}


编译器转化出的代码会捕获构造函数抛出的异常,将已经分配了的内存释放掉,然后将异常向上传递。

 

delete操作也是分成两步,首先调用对象的析构函数释放对象包含的资源,然后释放对象本身。

delete p; //编译器转化为
if(p != NULL)
{
Object::~Object(p);

__delete(p);
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: