关于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创建一个类对象也是,先分配类大小的内存,然后调用构造函数进行初始化。这里有一个疑问,当构造函数抛出异常时怎么办?编译器是这样做的:
编译器转化出的代码会捕获构造函数抛出的异常,将已经分配了的内存释放掉,然后将异常向上传递。
delete操作也是分成两步,首先调用对象的析构函数释放对象包含的资源,然后释放对象本身。
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); }
相关文章推荐
- 深度探索c++对象模型之new和delete运算符介绍
- 关于模板编程的一个例子 来自深度探索c++对象模型
- 深度探索c++对象模型之placement operator new语意
- 深度探索C++对象模型复习和学习 第一章 关于对象 (Object Lessons)
- [深度探索C++对象模型]关于成员初始化列表(member initiallization list)
- 【深度探索C++对象模型】第一章 关于对象
- 深度探索C++对象模型--关于对象
- 深度探索C++对象模型 关于对象的笔记
- 深度探索C++对象模型之一 --- 关于对象
- 深度探索C++对象模型-----编译器’何时‘自动合成nontrivial default constructor
- 【深度探索c++对象模型】关于对象
- 深度探索c++对象模型 小结【转】
- 深度探索C++对象模型 第二章 读书笔记
- 读【深度探索C++对象模型】【上】
- 读【深度探索C++对象模型】【下】
- 深入探索C++对象模型笔记之二 —— 关于对象(下)
- 深度探索C++对象模型2
- 深度探索c++对象模型 学习笔记 chapter2-1 default constructor
- 读【深度探索C++对象模型】【上】
- Inside The C++ Object Model (深度探索C++对象模型) 第一讲 关于对象