C++ new delete执行时机和重载说明
来源:互联网 发布:神州数码erp软件 编辑:程序博客网 时间:2024/04/28 20:22
以下代码取自Thinking C++
#include<cstdio>#include<cstdlib>//using namespace std;void* operator new(size_t sz){printf("operator new:%d Bytes\n",sz);void* m = malloc(sz);if(!m) puts("out of memory");return m;}void operator delete(void* m){puts("operator delete");free(m);}class S{int i[100];public:S(){puts("S::S()");}~S(){puts("S::~S()");}};int main(){puts("creating & destorying an int");int *p = new int[47];delete p;puts("creating & destorying an s");S* s = new S;delete s;puts("creating & destorying S[3]");S* sa = new S[3];delete[] sa;return 0;}
其运行结果如下:
creating & destorying an intoperator new:188 Bytesoperator deletecreating & destorying an soperator new:400 BytesS::S()S::~S()operator deletecreating & destorying S[3]operator new:1204 BytesS::S()S::S()S::S()S::~S()S::~S()S::~S()operator delete
上面的例子可以看到operator new和operator delete 重载函数并没有显式的调用S类的构造函数,但是打印的结果却有构造函数和析构函数的输出,我一直没理解这一点。开始我人为原始的operator new是内部有调用的,但是thinking in C++ 明确说了构造函数和析构函数是编译器决定的,所以这个想法就很有问题。但是显然new关键字和operator new函数不是一个东西,换句话说他们根本不是等价的,如果你觉得重载了operator new就代表重载了new那就陷入了一个误区。
new关键字是不可以重载的,可以重载的从来只有operator new,而operator new允许开发者重载的理由很简单,他是用来让你改写存储分配方案的,就是让你分配指定大小内存块的一个函数。
new一个对象的时候,会调用operator new,但是不等价与只有operator new,所以编译器回去调用你的构造函数。
从结果可以看到,new 一个对象之后,首先会分配内存(可以理解为调用operator new操作符),然后才是构造函数(这一步,由编译器完成,换句话说,任何的重载都没有干预到这一步)。同样,delete 一个对象,先调用析构(编译器完成),然后才是operator delete操作符释放内存。
以上是我在读Thinking in C++的时候困惑的地方,当然很细心的读者应该会觉得我说了废话。
关于new的其它的用法参照CSDN上的一篇博客,讲的很简单,但是包括了全部的三种情况!这里是链接:C++ new
0 0
- C++ new delete执行时机和重载说明
- C++new和delete重载
- 重载new 和 delete
- 重载new和delete
- new 和 delete 重载
- new和delete重载
- new和delete重载
- 重载new和delete
- 重载new 和delete
- 重载new[]和delete[]示例
- C++ new和delete重载
- C++ new和delete重载
- C++ new和delete重载
- new和delete符重载
- C++ new和delete重载
- c++ 重载new和delete
- 《Effective C++》读书笔记之item50:了解new和delete的合理替换时机
- 《Effective C++》:条款50:了解new和delete的合理替换时机
- Jboss7集群配置说明
- 第一次写博客
- 关于托盘弹出气泡的方法
- js控制全选,很实用
- eclipse字体大小
- C++ new delete执行时机和重载说明
- 黑马程序员—C语言_基础语法
- Jquery全选与反选
- NFC的安卓事儿(第二篇)
- hdu 1072bfs
- 在Bundle中传递自定义的ArrayList<Object>
- Android中不同activity之间数据的共享
- HDU 2006 求奇数的乘积
- POJ:2556 Largest Rectangle in a Histogram