浅谈new operator、operator new和placement new 分类: C/C++ 2015-05-05 00:19 41人阅读 评论(0) 收藏
浅谈new operator、operator new和placement new
C++中使用new来产生一个存在于heap(堆)上对象时,实际上是调用了operator new函数和placement new函数。new即new operator,是C++保留的关键字,我们无法改变其含义,但我们可以改变new完成它功能时调用的两个函数,operator new()和placement new()。operator new()用于申请heap空间,功能类似于malloc(),placement new()用于在已经获得的堆空间上调用类构造函数。
例如代码:
string* sp=new string(“hello world”);
等价于:
string* sp=NULL;
sp =operator new(strlen(“hello world”));//申请空间,行为类似于malloc
new (sp) string(“hello world”);//调用string类的构造函数,初始化申请空间
operator new()的函数原型:
void* operator new(size_t sz);
示例代码如下:
void* operator new(size_t sz) throw(std::bad_alloc)
{
cerr << "allocating " << sz << " bytesn "<<endl;
void* mem = malloc(sz);
if (mem)
return mem;
else
throw std::bad_alloc();
}
注意:
1. 函数后添加throw表示可能会抛出throw后括号内的异常。
2. operator new()分为全局和类成员。当为类成员函数时,使用new产生类对象时调用的则是其成员函数operator new()。
placement new()的函数原型是:
void* operator new(std::size_t, void* __p);
示例代码如下:
void* operator new(std::size_t, void* __p) throw()
{
return __p;
}
注意:
1. placement new()的函数原型不是void* placement new(std::size_t, void* __p);
2. placement new只是operator new()的一个重载,多了一个已经申请好的空间,由void* __p指定。
3. 用法是new (addr) constructor():对addr指定的内存空间调用构造函数进行初始化。为何称为placement new,从其用法可以看出只是用于调用构造函数。
总结:
1. 若想在堆上建立一个对象,应该用new操作符。它既分配内存又调用其构造函数进行初始化。
2. 若仅仅想分配内存,应该调用operator new(),他不会调用构造函数。若想定制自己在堆对象被建立时的内存分配过程,应该重写自己的operator new()。
3. 若想在一块已经获得的内存空间上建立一个对象,应该用placement new。虽然在实际开发过程中,很少需要重写operator new(),使用内置的operator new()即可完成大部分程序所需的功能。但知道这些,有助于一个C++程序猿对C++内存的管理有个清楚的认识。
了解delete和operator delete():
为了避免内存泄漏,每个动态内存分配必须与一个等同相反的 deallocation 对应。数operator delete与delete操作符的关系与operator new与new操作符是一样的。delete用于使用使用new申请的空间,operator delete用于释放operator new申请的空间(类似于malloc与free),那谁来清理placement new初始化的内存内容呢?唯一办法就是调用对象的析构函数。
示例代码:
string* sp=new string(“hello world”);
delete sp;
第一行代码在上文已经剖析,那么当调用delete sp时,发生了什么?
delete sp等价于:
ps->~string(); //用于清理内存内容,对应placement new
operator delete(ps);//释放内存空间,对应于operator new()
其中operator delete()的函数原型为:
void operator delete(void *memoryToBeDeallocated);
参考文献:
[1]Scott Meyers.More Effective C++(第三版)[M].北京:电子工业出版社,2011.1.
[2]zjdtc的博客-新浪博客.operator new在C++中的各种写法. http://blog.sina.com.cn/s/blog_3c6889fe0100tqe8.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
浅谈new operator、operator new和placement new 分类: C/C++ 2015-05-05 00:19 41人阅读 评论(0) 收藏的更多相关文章
- 浅谈IOS8之size class 分类: ios技术 2015-02-05 19:06 62人阅读 评论(0) 收藏
文章目录 1. 简介 2. 实验 3. 实战 3.1. 修改 Constraints 3.2. 安装和卸载 Constraints 3.3. 安装和卸载 View 3.4. 其他 4. 后话 以前和安 ...
- 浅谈声明与定义的区别 分类: C/C++ 2015-06-01 15:08 157人阅读 评论(4) 收藏
以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类 ...
- 由一段代码谈前端js优化和编码规范(一) 分类: JavaScript 2015-03-21 12:43 668人阅读 评论(1) 收藏
这段代码是撸主刚毕业那会写的,主要是实现一个左侧的导航条的折叠功能.当时实现的比较简陋,每次在导航条增加新的项目的时候,都要手动去修改js代码中写死的索引...确实是比较恼火的,后来就修改了一下,能够 ...
- 【转】 浅谈Radius协议
浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报 分类: Radius协议分析(6) 从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...
- 转:浅谈Radius协议 -来自CSDN:http://blog.csdn.net/wangpengqi/article/details/17097221
浅谈Radius协议 2013-12-03 16:06 5791人阅读 评论(0) 收藏 举报 分类: Radius协议分析(6) 从事Radius协议开发有段时间了,小弟不怕才疏学浅,卖弄一下, ...
- 浅谈Android手机木马手工查杀
这篇文章主要是浅谈,所以会从简单方面开始讲起. 关于手机木马查杀,有些人会说安装手机杀毒软件不就解决了吗? 其实不然.因为手机和PC不一样,手机反木马技术没有PC端那么强. 就算你把目前市面上的所有手 ...
- 浅谈Volatile与多线程
标题:浅谈Volatile与多线程 2011-04-19 22:49:17 最近看的比较杂,摘了一些人的笔记!随着多核的日益普及,越来越多的程序将通过多线程并行化的方式来提升性能.然而,编写正 ...
- [转帖]浅谈响应式编程(Reactive Programming)
浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
随机推荐
- Windows下面安装easy_install报UnicodeDecodeError: 'ascii' codec can't decode byte解决方法
在运行python ez_setup.py install后, 发现是在下载并解压setuptools-2.1,并运行setup.py时出现如下错误: 提示D:\Python27\lib\mimety ...
- ThinkPHP配置信息
在index.php文件中设置常量: define('BIND_MODULE', 'Home'); 进行绑定默认访问的模块. 同样的,也可以在配置文件config.php中的配置数组中设置配置常量: ...
- CSS 3 动画2D
动画分为两种,1,逐帧动画 组成动画的每一个画面就是一帧 2,关键帧动画,确定关键帧电脑会自动过度 动画中如果遇到不兼容的问题也是要加前缀 @-webkit-keyframes规则 @-webk ...
- 算法课堂笔记13—Online Algorithm
今天的算法课是学习离线算法,在计算机科学中,一个在线算法是指它可以以序列化的方式一个个的处理输入,也就是说在开始时并不需要已经知道所有的输入.相对的,对于一个离线算法,在开始时就需要知道问题的所有输入 ...
- IntelliJ UI安装
- 使用Markdown+Pandoc+LaTex+Beamer制作幻灯片
概述 为什么使用markdown? mardown是一种轻量级的标记语言,语法简单,可读性好,并且容易转化成其他格式的文档, 在技术文档撰写中得到越来越广泛的应用.相信大家对markdown都有一定了 ...
- WCF初探-5:WCF消息交换模式之双工通讯(Duplex)
双工通讯Duplex具有以下特点: 1它可以在处理完请求之后,通过请求客户端中的回调进行响应操作 2.消息交换过程中,服务端和客户端角色会发生调换 3.服务端处理完请求后,返回给客户端的不是reply ...
- vm10虚拟机安装Mac OS X10.10教程[转]
update:http://www.sysprobs.com/vmware-workstation-8-0-8-0-1-unlocker-to-run-mac-os-x-guest-in-window ...
- Ubuntu下安装Java环境
1 Java 8 下载地址 http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs. ...
- c# 配置文件之configSections配置(三)
使用IConfigurationSectionHandler配置configSections ·步骤1:定义一个实体类 using System; using System.Collections.G ...