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
原创粉丝点击