博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中new的二三事
阅读量:5022 次
发布时间:2019-06-12

本文共 1629 字,大约阅读时间需要 5 分钟。

1 #include 
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 =" <
<<", 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!" <

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

于是写了如下代码

1 #include 
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!" <

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

这是为什么呢?

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

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

1 #include 
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!

 

转载于:https://www.cnblogs.com/kevingeek/p/3891902.html

你可能感兴趣的文章
hexo 搭建博客
查看>>
关于 UIWebView 几个高级用法
查看>>
maven创建的项目中无法创建src/main/java 解决方案
查看>>
华为软件开发云测评报告二:代码检查
查看>>
集合1
查看>>
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>