C++中new的二三事

 1 #include <iostream>
 2 using std::cout;
 3 using std::endl;
 4 #define new New (__FILE__,  __LINE__) 
 5 
 6 void * operator new (size_t size,  const char * filename,  int lineno) 
 7 { 
 8  cout <<"NEW: filename =" <<filename <<",  lineno =" <<lineno << endl; 
 9  cout <<"Lineno? "<< size << endl;
10  return operator new (size); 
11 }
12 int main (int argc,  char ** argv) 
13 { 
14  int * p = new  (__FILE__,  __LINE__) int ; 
15  cout <<"Hello World!" <<endl; 
16  delete p; 
17  return 0; 
18 } 

是的,一切都是因为在一篇老外的博客里面看到了第14行,因此我要挖个坑来埋自己。

于是写了如下代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void * operator new (size_t size) 
 5 { 
 6     std:: cout <<"Lineno? "<< size << endl;
 7     return operator new (size); 
 8 }
 9 int main (int argc,  char ** argv) 
10 { 
11     int * p = new  int ; 
12     std:: cout <<"Hello World!" <<std:: endl; 
13     delete p; 
14     return 0; 
15 } 

不难看出,这是一个死循环,将无限重复输出Lineno? 4

这是为什么呢?

原因很简单,因为C++中的new操作分两个阶段,分别是申请内存与执行构造函数,这也是与malloc函数不同的地方。简单来说,malloc返回的是void*类型,也正式new的第一个阶段所做的操作(实际上也是调用malloc函数)。接下来我们要介绍两个东西,一个叫做new 操作符,一个是operator new函数。(是不是很绕?)

接下来我们来看一个例子,应该就一目了然了。

 1 #include <iostream>
 2 using namespace std;
 3 class A{
 4     public:
 5         A(){
 6             cout << "Constructor of A" << endl;
 7         }
 8 };
 9   
10 void * operator new (size_t size,  int lineno) 
11 { 
12     std:: cout <<"Lineno? "<< lineno << endl;
13     return operator new (size); 
14 } 
15 
16 int main (int argc,  char ** argv) 
17 { 
18     A * p = new (__LINE__) A  ; 
19     cout << "Hello World!" << endl; 
20     delete p; 
21     return 0; 
22 } 

显示调用了operator new里面的输出当前行的代码,然后再调用了A的构造函数,最后输出了我们在main函数中的Hello World!

 

posted @ 2014-08-05 11:43  Kevin_Geek  阅读(357)  评论(0编辑  收藏  举报