c++ new 用于动态分配内存。比如 A* a=new A();其实这里一共有三步:

1、分配sizeof(A)的内存,这里的分配是通过operator new(std::size_t)实现的

2、在分配的内存上初始化,调用A的构造函数

3、返回相应指针

某些时候我们需要重载operator new来达到一些目的,如内存泄漏检查。

一、operator new重载

需要注意几个问题:

1、应该实现handle_new,即分配内存不成功时的措施。

2、第一个参数应该是std::size_t

3、一般不重载placement new,placement new本身就是operator new的一种标准重载形式

4、重载operator new后要实现相应的operator delete,不过只有分配内存失败时才会调用重载的delete,或者还是会调用全局delete

重载实例

#include <iostream>
#include <string>
using namespace std;class X
{
public:X() { cout<<"constructor of X"<<endl; }~X() { cout<<"destructor of X"<<endl;}void* operator new(size_t size,string str){cout<<"operator new size "<<size<<" with string "<<str<<endl;return ::operator new(size);}void operator delete(void* pointee){cout<<"operator delete"<<endl;::operator delete(pointee);}
private:int num;
};int main()
{X *px = new("A new class") X;delete px;return 0;
}

二、placement new

placement new可以在指定的内存空间上构造对象,它的原型为:

void * operator new(std::size_t,void *p){return p;
}

使用方式如下:

new(ptr) A();其中ptr为已分配好的内存。

Placement new使用步骤

在很多情况下,placement new的使用方法和其他普通的new有所不同。这里提供了它的使用步骤。

第一步  缓存提前分配

有三种方式:

1.为了保证通过placement new使用的缓存区的memory alignment(内存队列)正确准备,使用普通的new来分配它:在堆上进行分配
class Task ;
char * buff = new [sizeof(Task)]; //分配内存
(请注意auto或者static内存并非都正确地为每一个对象类型排列,所以,你将不能以placement new使用它们。)

2.在栈上进行分配
class Task ;
char buf[N*sizeof(Task)]; //分配内存

3.还有一种方式,就是直接通过地址来使用。(必须是有意义的地址)
void* buf = reinterpret_cast<void*> (0xF00F);

第二步:对象的分配

在刚才已分配的缓存区调用placement new来构造一个对象。
Task *ptask = new (buf) Task

第三步:使用

按照普通方式使用分配的对象:

ptask->memberfunction();

ptask-> member;

//...

第四步:对象的析构

一旦你使用完这个对象,你必须调用它的析构函数来毁灭它。按照下面的方式调用析构函数:
ptask->~Task(); //调用外在的析构函数

第五步:释放

你可以反复利用缓存并给它分配一个新的对象(重复步骤2,3,4)如果你不打算再次使用这个缓存,你可以象这样释放它:delete [] buf;

三、operator new[]

new[]和new类似,仍然会优先调用类中重载的operator new[]。另外还要注意的是,在operator new[](size_t size)中传入的并不是sizeof(A)*num。而要在对象数组的大小上加上一个额外数据,用于编译器区分对象数组指针和对象指针以及对象数组大小。

转载于:https://www.cnblogs.com/coderht/p/7206283.html

c++ new, operator new, placement new相关推荐

  1. C++两个 delete 后的问题 野指针

    最近在网上看到两个关于指针 delete 后的问题.第一种情况: 1 2 3 int* p = new int; delete p; delete p;// p为什么能delete两次,而程序运行的时 ...

  2. 对C++中new的认识

    在C++中,我们常会遇到三种new的形式:operator new .new operator .placement new ①new operator (new操作符):①申请空间  ②创建对象 图 ...

  3. C++ - 深入理解new

    C++中new有三种形式:new operator.operator new和placement new. 1. new operator new operator就是我们平时使用的new表达式,来为 ...

  4. 2012.4.17内存相关

             在VC中,栈空间未初始化的字符默认是-52,补码为0XCC,两个0xcc即0xcccc在GBK编码中,就"烫":堆空间未初始化的字符默认是-51,两个-51 在G ...

  5. C++内存管理机制—Primitives笔记

    Primitives -基本实体 文章目录 1.c++应用程序,使用memoryde 途径 2 .基本构件之一 new/delete expressions 2.1 当用New分配空间时 2.2 释放 ...

  6. C++ 内存管理 —— 第一講:C++ 內存構件

    C++ 内存管理 侯捷老师的课程内容,做了个简单的记录 文章目录 第一講:C++ 內存構件 四个层面 基本構件 new delete expression malloc的cookie机制 arrary ...

  7. 牛客上C++的面试题和答案

    作者:弑风之痕 链接:https://www.nowcoder.com/discuss/578910 来源:牛客网 说一下C++和C的区别 C++是面向对象的语言,而C是面向过程的结构化编程语言 语法 ...

  8. STL_空间配置器allocator

    空间配置器 所有的STL的操作对象(所有的数值)都存放在容器内,而容器一定要配置空间才能存放资料 空间配置器的标准接口 typedef unsigned int size_t: allocator:: ...

  9. 字节一面不知道是不是凉经(总结千万别装逼,装逼遭雷劈)

    一面字节(47分钟) 1-C++面向对象这个怎么理解,怎么实现? 2-说一下new operator,operator new,placement new.继续placement new用在哪?为什么 ...

最新文章

  1. msclass 文字滚动_文字无缝循环滚动(标题向上滚动)
  2. linux 编译环境包,linux上war包编译环境搭建(示例代码)
  3. QT的QScxmlCppDataModel类的使用
  4. 基于 Flink 的超大规模在线实时反欺诈系统的建设与实践
  5. dos命令配置jdk环境
  6. android应用窗口模式,[技巧]如何启用Android N开发者预览版中的“自由窗口”模式...
  7. 在Angular专家Dan Wahlin的免费33部分课程中学习Angular
  8. wav文件头修复_windows文件夹分析(xp版,网络整理)
  9. 2016.03.18 近日买房以及学习事项
  10. 使用ef core自动生成mysql表和数据编码的问题
  11. [转]关于Win32 Console的计时器
  12. python解析GF1卫星数据.xml文件
  13. 数据库自学-SQL-四大SQL语句DDL、DML、DQL、DCL
  14. notepad++中文版下载
  15. 一位Google程序员的算法学习之路
  16. 伟大的数学家,怎么都诞生在法国?
  17. 数据分析|数据分布特征的描述
  18. 《中国睡眠研究报告2022》:被调查大学生睡前不看手机的不足3%
  19. 【卷积神经网络】CNN详解以及猫狗识别实例
  20. 湖北省武汉汽车上牌篇2008年完整上牌程序供参考

热门文章

  1. Spring集成Quartz定时任务 ---- 定时执行
  2. hdu 1525 博弈
  3. Centos7安装 Redis 实践
  4. 精通Android自定义View(九)绘制篇Canvas分析之绘制图片
  5. AndroidStudio快捷键——打开最近编辑文件列表视图——(一)
  6. Android ViewStub
  7. Java中的强软弱虚引用《对Java的分析总结三》
  8. Docker04-镜像
  9. HBuilder打包App方法
  10. Jenkins系列-Jenkins插件备份