一、placement new 调用过程

1、源代码

#include <new>class CTest
{
public:int i_ = 0;int t_ = 0;
};int main()
{void *pbuffer = (void*)new char[sizeof(CTest)];CTest *ptest = new (pbuffer) CTest();return 0;
}

2、反汇编代码

3、查看C++源码,获取 operator new 的实现函数,如下

inline void *operator new(size_t _Size, void* _Where)
{(void)_Size;return _Where;
}

这里我们发现,placement new 的 operator new 函数由于外部已经给他分配了内存,所以该函数没有执行 malloc 函数,仅仅是将外部申请的内存返回。

二、重载 placement new

1、方法

void *operator new (size_t size,void *pbuffer)
{size;return pbuffer;
}

2、上述函数若放在全局,则重载了全局 placement new 对应的 operator new 函数。

若放在类中,则重载了针对该类的 placement new 对应的 operator new 函数。

3、栗子

#include <new>
#include <iostream>class CTest
{
public:int i_ = 0;int t_ = 0;
public:/*** 重载的 placement new 对应的 operator new 函数。*/static void* operator new(size_t size,void *pbuffer);
};void* CTest::operator new(size_t size, void* pbuffer)
{size;std::cout << "执行了类中的重载 placement new 函数。" << std::endl;return pbuffer;
}int main()
{void *pbuffer = (void*)new char[sizeof(CTest)];CTest *ptest = new (pbuffer) CTest();/*** placement new 标准的释放方法。*/ptest->~CTest();delete[]pbuffer;return 0;
}

结果

执行了类中的重载 placement new 函数。

三、总结

1、placement new 并不会申请内存,它只是在已经申请的内存上构建一个对象,即:执行该对象的构造函数!

2、格式:new (地址) classname () 。

3、流程图,如下:

(SAW:Game Over!)

Cpp 对象模型探索 / placement new 实现原理相关推荐

  1. Cpp 对象模型探索 / 系列文章的索引

    一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...

  2. Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)

    源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...

  3. Cpp 对象模型探索 / 对象访问成员变量的原理

    一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...

  4. Cpp 对象模型探索 / 多态的本质

    普通成员函数的调用方式是直接通过编译期间确定的函数地址来调用. 多态是通过查询对象的虚函数表来获取虚函数的地址.因为像工厂模式这样,并不能在编译期间知道基类指向的是哪个子类,也就导致了不能在编译期间获 ...

  5. Cpp 对象模型探索 / 单一继承的类的内存布局

    目录 1.父类和子类都没有虚函数 2.父类有虚函数.子类没有虚函数 3.父类没有虚函数,子类有虚函数 4.父类和子类都有虚函数 5.总结 #include <iostream> class ...

  6. Cpp 对象模型探索 / 含有虚基类的类的内存布局

    一.栗子 class Grand { public:int i_grand_ = 8; };class Parent1 : public virtual Grand { public:int i_pa ...

  7. Cpp 对象模型探索 / 不能被继承的类

    两种方法 C++ 11 final 关键字 友元类 + 虚继承. 栗子 class A { private:A() {}friend class B; }; class B : virtual pub ...

  8. Cpp 对象模型探索 / 带有虚继承类的构造函数的调用顺序

    栗子 #include <iostream> class A { public:A() { std::cout << "A" << std::e ...

  9. Cpp 对象模型探索 / 外部调用私有的虚函数的方法

    答案 通过虚函数表指针找到虚函数表,再通过虚函数表中的元素,即:函数指针,得到私有函数的首地址. 示例 #include <iostream>class A { private:virtu ...

最新文章

  1. iOS 上常用的两个功能:点击屏幕和return退出隐藏键盘和解决虚拟键盘
  2. 北斗芯片服务器,北斗芯片:GPS定位系统,正是再见!你期待吗?
  3. 贝索斯专访:亚马逊帝国大规模业务转型的秘诀
  4. 【Java Web开发指南】解析Spring中Ioc和DI(入门Demo)
  5. mac idea配置配置自动清除类中无用的import包
  6. PCA对特征点描述子降维
  7. 梦燕服饰:企业数字化走得快不是真本事,走得稳才是硬道理
  8. Android 渗透测试学习手册 第九章 编写渗透测试报告
  9. 张一鸣早期创业的访谈还挺有启发,不知道他现在的观念有没有改变
  10. 架构师学习笔记(持续更新)
  11. Oracle的取整和四舍五入函数——floor,round,ceil,trunc使用说明
  12. JAVA发布栅格图层_简单实现栅格布局的两种方式
  13. Spring web开发用post方法和button遇到http405的一种解决方法
  14. 校园火灾项目结合Focus
  15. c++国际象棋上的麦粒
  16. 无线渗透-----aircrack-ng破解WEP加密
  17. 从加密朋克到赛博朋克,一文盘点热门NFT头像项目
  18. 基于python的在线音乐系统设计与实现
  19. 微软商店,打开就显示无法加载该页面 代码0x80131500,网上一般不说的标准解决方案
  20. Android实现新闻列表

热门文章

  1. YUMI~~强大的USB启动盘制作工具!!
  2. maven实战笔记-12
  3. 674 Longest Continuous Increasing Subsequence(每日一题)
  4. K8S部署工具:KubeOperator集群规划-手动模式
  5. k8s使用port-forward访问集群中的应用程序(只能在执行命令的机器上开放端口)
  6. Jenkins真正地完整迁移流程(亲测有效)
  7. Jenkins项目迁移
  8. docker重启容器命令
  9. mybatis-plus自定义配置方式
  10. 打印JVM配置参数的命令