小结: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 ...
随机推荐
- 使用IPTABLES限制IP上传下载速度,如何用iptables限速?
怎样使用IPTABLES限制IP上传下载速度,如何用iptables限速?我们先来看范例: iptables限制某IP的上传速度为1000KB/秒(8Mbps,流入服务器带宽),即在此IP所在的服务器 ...
- Inspinia_admin-V2.3原版(英文)
Inspinia_admin-V2.3原版(英文) Inspinia_admin-V2.3 BootStrap原版(英文) 原版是老外开发的,结果 国内某人翻译成中文版进行二次开发 卖998 演示地址 ...
- CEF小白人系列2-DEV环境配置-Windows10+SDK+VS2015
以下资料整理来自CEF官方教学.作者做了翻译和整理.并会以一种重事件操作的方式来一点点入门. 3个问题: 在上一篇内容中我们了解了什么是CEF,能干些什么.必要的物理学习环境. 下面我们也是以带着问题 ...
- LNMP搭建环境遇到的N多坑
最近配置开发用的lnmp环境,环境配置完成后,爆500错误,查看nginx错误日志 open_basedir 将 PHP 所能打开的文件限制在指定的目录树,包括文件本身 错误日志显示,访问脚本不在 o ...
- nginx笔记6-总结
1.轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.2.weight指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况.3.ip_ ...
- Spring注解简介
提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖. 1. 使用注解方式配置 我们需要修改spring配置文件的头信息,修改部分红色标注,如下: <c ...
- HDFS读写过程
HDFS的读写过程: 读过程: Client收到用户的读请求——client拿着path向namenode请求文件或者block的datanode列表——client从返回的datanode列表中选择 ...
- wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定
#region CheckBox与TextBox绑定 Dictionary<CheckBox, TextBox> CheckTextBoxDic = new Dictionary<C ...
- Java常量定义
Java常量定义 /** * char 类型常量 */ private static final char CHAR = 'A'; /** * byte 类型常量 */ private static ...
- Linux显示计算次数的结果
Linux显示计算次数的结果 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -c free:选项需要一个参数 -- c Usage: free [o ...