小结:c++中的new、operator new和placement new
小结:c++中的new、operator new和placement new
- new(也称作new operator),是new 操作符,不可重载
class T{...};
T *t = new T(initial_args_list); //此时的new ,是new 操作符
new操作 会执行以下三个步骤
- 调用类的(如果重载了的话)或者全局的operator new分配空间
- 用类型后面列的参数列表来调用构造函数,生成类对象
- 返回对应的指针
- operator new 是operator 函数,与operator +类似,可以被重载,operator new一般在类中进行重载。在全局重载容易造成程序崩溃,因为全局的::operator new 负责整个程序运行期间的堆空间的分配,重载全局::operator new 须慎之又慎!
- operator new 在类中重载,完成自定义操作,并调用全局::operator new,返回对应的指针
例如:
class T{
...
void* operator new(size_t,args...){
... //自定义操作
return ::operator new(size_t);
}
};
- placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替,即不能重载。它的作用是在已分配的空间中构造对象。
void *operator new( size_t, void * p ) throw() { return p; }
Placement new使用步骤
在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。
- 缓存提前分配
char*buf = (::operator new((size_t)(sizeof(T))));
- 对象的分配,在已分配的缓存中调用构造函数,生成对象
T *t = new(buf)T;
- 使用对象,用-> 访问对象的成员
t->men_func();
- 调用外在的析构函数
t->~T();
- 释放资源
delete [] buf;
使用例子
#include <stdio.h>
#include <iostream>
#include <string>
#include <malloc.h>
using namespace std;
class testNew{
public:
testNew(){ cout << "执行了testNew::testNew() 构造函数" << endl; }
~testNew(){ cout << "执行了testNew::~testNew() 析构函数" << endl; }
void* operator new(size_t size, string str){
cout << "重载1:testNew::op new," << str << endl;
return ::operator new(size);
}
void* operator new(size_t size){
cout << "重载2:testNew::op new,without str" << endl;
return ::operator new(size);
}
void print(){
cout << "已初始化成功" << endl;
}
};
void * operator new(size_t size)
{
cout << "::op new 内存分配 "<< endl;
return malloc(size);
}
int main()
{
cout << "重载全局 ::op new" << endl;
char * buf = (char *)(::operator new((size_t)(sizeof(testNew))));
cout << endl;
cout << " placement new" << endl;
//不加::,会调用 void* testNew:: operator new(size_t size, string str)
//导致不能匹配全局的placement new
testNew *test = ::new (buf)testNew;
test->print();
test->~testNew();
delete []buf;
cout << endl;
cout << " 重载 testNew::op new 1" << endl;
//此时输出有4行
testNew *test2 = new("with str")testNew;
//::op new 内存分配 -> 给const char* "重载"分配堆空间
//重载1:testNew::op new,with str ->调用testNew::op new 1
//::op new 内存分配 ->testNew::op new 1调用 全局的 ::op new
//执行了testNew::testNew() 构造函数
test2->print(); //输出 “已初始化成功” ,表示已正确返回指针
cout << endl;
cout << " 重载 testNew::op new 2" << endl;
testNew *test3 = new testNew;
test3->print(); //输出 “已初始化成功” ,表示已正确返回指针
cout << endl;
cout << "析构" << endl;
delete test2;
delete test3;
getchar();
return 0;
}

- 原创所有,转载注明出处,若有错误,欢迎大家指正,共同学习。谢谢!
小结:c++中的new、operator new和placement new的更多相关文章
- C++中的new,operator new与placement new
以下是C++中的new,operator new与placement new进行了详细的说明介绍,需要的朋友可以过来参考下 new operator/delete operator就是new和 ...
- C++ 中 new 操作符内幕:new operator、operator new、placement new
一.new 操作符(new operator) 人们有时好像喜欢有益使C++语言的术语难以理解.比方说new操作符(new operator)和operator new的差别. 当你写这种代码: st ...
- c++中的new、operator new、placement new
一.定义 1.new new是c++中的关键字,,其行为总是一致的.它先调用operator new分配内存,然后调用构造函数初始化那段内存. new 操作符的执行过程:1. 调用operator n ...
- C++中的new、operator new与placement new
转:http://www.cnblogs.com/luxiaoxun/archive/2012/08/10/2631812.html new/delete与operator new/operator ...
- 浅谈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函数和placeme ...
- new 、operator new 和 placement new
一.原生operator new 我们先从原生operator new开始.考虑如下代码,它用来分配5个int型的空间并返回指向他们的指针[1]: int* v = static_cast<in ...
- C++ new operator, delete operator, operator new, operator delete, new placement
http://www.younfor.com/cpp-new-placement-new-operator-new.html http://www.cnblogs.com/luxiaoxun/arch ...
- 浅析C++内存分配与释放操作过程——三种方式可以分配内存new operator, operator new,placement new
引言:C++中总共有三种方式可以分配内存,new operator, operator new,placement new. 一,new operator 这就是我们最常使用的 new 操作符.查看汇 ...
- [C++空间分配]new运算符、operator new、placement new的区别于联系
先科普一下: 1. new的执行过程: (1)通过operator new申请内存 (2)使用placement new调用构造函数(内置类型忽略此步) (3)返回内存指针 2. new和malloc ...
随机推荐
- MongoDB安装篇-Win7 X64
介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库 ...
- ci框架基础知识点
一.路由 1.index.php/test/hello->控制器test的hello方法 2. 也可以手动配置路由 app/config/routes.php中 I:$route[' ...
- 项目实战14—ELK 企业内部搜索引擎
一.els.elk 的介绍 1.els,elk els:ElasticSearch,Logstash,Kibana,Beats elk:ElasticSearch,Logstash,Kibana ① ...
- nginx笔记6-总结
1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.2.weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.3.ip_ ...
- c#获取文件MD5算法
//获取文件MD5算法 private static string GetMD5FromFile(string fileName) { try { FileStream file = new File ...
- java I/O框架 (三)基本流
概述 基本流有字节输入输出流(InputStream,OutputStream),和字符输入输出流(Reader,Writer),它们都是抽象类,作为Java IO API中其他所有流的父类存在. 我 ...
- probabilistic robotics_Kalman filter(一)
码农生活告一段落,继续.... 多元正态分布 协方差矩阵,为正定对称矩阵.det表示行列式 协方差反应随机样本变量各分量之间的相关性. 当变量的假设模型不一致时,不适合用高斯滤波. 叠加高斯噪声的线性 ...
- 嵌入式Linux引导过程之1.1——Xloader的xloader.lds
本文中的所有代码版本都是基于ST的SpearPlus开发板的. xloader是在系统上电之后,执行完ROM中的frimware后最先开始执行的用户程序,它的体积很小,执行的功能也很简单,主要是对系统 ...
- mysql学习笔记03 mysql数据类型
数值型:整数型 小数型字符串型时间和日期类型 数值型①整数型1 2 3 4 81bin表示1位,1Byte表示一个字节1B=8b.1汉字=2字节(1 word = 2 byte)1字节=8位(1 by ...
- 个性化WinPE封装方法 ----最后实战“制作WinPE3.0图文教程”
经过前几讲,主要目的就是准备一些"原材料",熟悉一些"命令",实际上是"战前演练准备".下面要进入"实战状态",成败在此 ...