博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小结:c++中的new、operator new和placement new
阅读量:5071 次
发布时间:2019-06-12

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

c++中的new、operator new和placement new

一、new

  • new(也称作new operator),是new 操作符,不可重载
class T{...};T *t = new T(initial_args_list); //此时的new ,是new 操作符

new操作 会执行以下三个步骤

  1. 调用类的(如果重载了的话)或者全局的operator new分配空间
  2. 用类型后面列的参数列表来调用构造函数,生成类对象
  3. 返回对应的指针

二、 operator new

  • operator new是 operator 函数,与operator +等函数类似,可以被重载,operator new一般在类中进行重载。在全局重载容易造成程序崩溃,因为全局的::operator new 负责整个程序运行期间的堆空间的分配,重载全局::operator new 须慎之又慎!

例:

class T{    ...    void* operator new(size_t){    ... //自定义操作      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 
#include
#include
#include
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:testNe w::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;}

1239821-20180313114559754-2123302325.png

  • 原创所有,转载注明出处,若有错误,欢迎大家指正,共同学习。谢谢!

转载于:https://www.cnblogs.com/pz-Feng/p/8555861.html

你可能感兴趣的文章
python的列表与shell的数组
查看>>
移动国家号(MCC)
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
display的值有哪些?
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
基于Lucene3.5.0怎样从TokenStream获得Token
查看>>
一网打尽各类Java基本数据类型转换
查看>>
FlowLayout布局
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>
深入浅出理解zend framework(三)
查看>>
python语句----->if语句,while语句,for循环
查看>>
javascript之数组操作
查看>>