• 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!

  • 相关阅读:
    6-8 Percolate Up and Down (20分)
    6-7 Isomorphic (20分)
    6-5 Evaluate Postfix Expression (25分)
    服务器磁盘满无法释放空间解析及解决
    必会的MySQL操作方法
    Tomcat基本安装和优化方法
    Nginx常用配置及优化安全
    Redis笔记整理(三):进阶操作与高级部分
    Redis笔记整理(二):Java API使用与Redis分布式集群环境搭建
    Redis笔记整理(一):Redis安装配置与数据类型操作
  • 原文地址:https://www.cnblogs.com/kevingeek/p/3891902.html
Copyright © 2020-2023  润新知