(转)C++中的new
转载自:http://blog.csdn.net/sparkliang/article/details/3650324
C++中的new其实是一个很糊弄人的术语,它有两种不同的含义,new运算符(new operator)和new函数(operator new),值得记录一下。
| 一 new运算符 |
最常用的是作为运算符的new,比如:
string *str = new string("test new");
作为运算符,new和sizeof一样,是C++内置的,你不能对它做任何的改变,除了使用它。
new会在堆上分配一块内存,并会自动调用类的构造函数。
| 二 new函数 |
第二种就是new函数,其实new运算符内部分配内存使用的就是new函数,原型是:
void *operator new(size_t size);
new函数返回的是一个void指针,一块未经初始化的内存。如你所见,这和C语言的malloc行为相似,你可以重载new函数,并且增加额外的参数,但是必须保证第一个参数必须是size_t类型,它指明了分配内存块的大小,C++允许你这么做,当然一般情况下这是不必要的。如果重载了new函数,在使用new操作符时调用的就是你重载后的new函数了。
如果使用new函数,和语句
string *str = new string("test new");
相对的代码大概是如下的样子:
string *str = (string *)operator new(sizeof(string));
str.string("test new"); // 当然这个调用时非法的,但是编译器是没有这个限制的
这还不算完,还有第三种的new存在。
| 三 placement new |
第三种,placement new,这也是new作为函数的一种用法,它允许你在一块已存在的内存上分配一个对象,而内存上的数据不会被覆盖或者被你主动改写,placement new同样由new操作符调用,调用格式是:
new (buffer) type(size_t size);
先看看下面的代码:
char str[];
int data = ;
int *pa = new (&data) int;
int *pb = new (str) int();
结果*pa = 123(未覆盖原数据),而*pb = 9(覆盖原数据),可以看到placement new 并没有分配新的内存,也可以使用在栈上分配的内存,而不限于堆。
为了使用placement new 你必须包含<new>或者<new.h>。
其实placement new和第二种一样,只不过多了参数,是函数new的重载,语法格式为:
void *operator new(size_t, void* buffer);
它看起来可能是这个样子:
void *operator new(size_t, void* buffer) { return buffer;}
和new对应的就是delete了,需要回收内存啊,不然就泄漏了,这个下次再写吧,回忆一下今天的内容先。
| 总结 |
1. 函数new
void *operator new(size_t size);
在堆上分配一块内存,和
placement new(void *operator new(size_t, void* buffer));
在一块已经存在的内存上创建对象,如果你已经有一块内存,placement new会非常有用,事实上,它STL中有着广泛的使用。
2. 运算符new
最常用的new,没什么可说的。
3. 函数new不会自动调用类的构造函数,因为它对分配的内存类型一无所知;而运算符new会自动调用类的构造函数。
4. 函数new允许重载,而运算符new不能被重载。
5. 紧接着就是对应的delete。
(转)C++中的new的更多相关文章
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
随机推荐
- notepad++下载及安装
下载notepad++: 官网 安装:https://jingyan.baidu.com/article/154b463109921828cb8f4151.html 如果下载的64位没有插件管理器,单 ...
- 一次面试留下的实际应用问题。关于HttpModule,IIS集成模式。
资料来自<IIS7开发与管理完全手册> 周五面试时有点紧张,没能静下心思考,当时隐约想到这个解决方案,但因面试环境和心态确未能明确的表述. 回家的地铁上已经找到解决办法. 要点:1基于IH ...
- 树的DFS
Depth-first search (DFS) is an algorithm for traversing or searching tree or graph data structures. ...
- <JZOJ5907>轻功
dp大水题 由于未知错误wa了一个点 乱改了一下就A了 瘫 #include<cstdio> #include<iostream> #include<cstring> ...
- <JZOJ4269>挑竹签
emm一开始将++cnt敲成cnt++ 就很委屈 一个拓扑排序而已 Description 挑竹签——小时候的游戏 夏夜,早苗和诹访子在月光下玩起了挑竹签这一经典的游戏.挑竹签,就是在桌上摆上一把竹签 ...
- Selenium&Pytesseract模拟登录+验证码识别
验证码是爬虫需要解决的问题,因为很多网站的数据是需要登录成功后才可以获取的. 验证码识别,即图片识别,很多人都有误区,觉得这是爬虫方面的知识,其实是不对的. 验证码识别涉及到的知识:人工智能,模式识别 ...
- tips [ 18870 ]
Created at 2017-08-23 Updated at 2018-01-31 Category 东方大陆 Tag 东方大陆 上面有编辑时间的,别吐槽说什么过期内容了使用 lightPIC图床 ...
- JSP Connect Database
JDBC简介 在Java技术中,访问数据库的技术叫做JDBC,它提供了一系列的API,让Java语言编写的代码连接数据库,对数据库进行添加.删除.修改和查询. JDBC相关的API存在java.sql ...
- MyBatis之一级缓存及其一级缓存失效
定义: 一级缓存:本地缓存:与数据库同一次会话(sqlSession)期间查询到的数据会放在本地缓存中,如果以后要获取相同的数据直接从缓存中获取,不会再次向数据库查询数据一个SqlSession拥有一 ...
- AndroidManifest.xml文件详解
本文为安全专家李洋的最新一篇专栏文章<AndroidManifest.xml文件详解>.AndroidManifest.xml是一个跟安全相关的配置文件,该配置文件是Android安全保障 ...