转载:https://www.cnblogs.com/weekbo/p/8533368.html

今天在使用new时,需要使用特定位置的一块内存,因此查了资料,发现该文章有帮助就现转载做一个备份。

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。

定位放置new操作的语法形式不同于普通的new操作。例如,一般都用如下语句A* p=new A;申请空间,而定位放置new操作则使用如下语句A* p=new (ptr) A;申请空间,其中ptr就是程序员指定的内存首地址。考察如下程序。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include <iostream>

using namespace std;

class A{

    int num;

public:

    A(){

        cout<<"A's constructor"<<endl;

    }

    ~A(){

        cout<<"~A"<<endl;

    }

    void show(){

        cout<<"num:"<<num<<endl;

    }

};

int main(){

    char mem[100];

    mem[0]='A';

    mem[1]='\0';

    mem[2]='\0';

    mem[3]='\0';

    cout<<(void*)mem<<endl;

    A* p=new (mem) A;

    cout<<p<<endl;

    p->show();

    p->~A();

    getchar();

}

  

程序运行结果: 
0024F924 
A’s constructor 
0024F924 
num:65 
~A

阅读以上程序,注意以下几点。 
(1)用定位放置new操作,既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。如本例就是在栈上生成一个对象。

(2)使用语句A* p=new (mem) A;定位生成对象时,指针p和数组名mem指向同一片存储区。所以,与其说定位放置new操作是申请空间,还不如说是利用已经请好的空间,真正的申请空间的工作是在此之前完成的。

(3)使用语句A *p=new (mem) A;定位生成对象是,会自动调用类A的构造函数,但是由于对象的空间不会自动释放(对象实际上是借用别人的空间),所以必须显示的调用类的析构函数,如本例中的p->~A()。

(4)万不得已才使用placement new,只有当你真的在意对象在内存中的特定位置时才使用它。例如,你的硬件有一个内存映像的I/O记时器设备,并且你想放置一个Clock对象在哪那个位置。

C++中的定位放置new(placement new)相关推荐

  1. C++中的opeartor new和placement new详解

    博客:https://goodfanqie.github.io(文章优先展示地方,推荐在此阅读.) new做了哪些: 在c++中,对new的调用时,new完成的工作通常是有以下几步: 调用operat ...

  2. java中如何就绝对定位,Java中如何定位资源

    Java中如何定位资源 本文来自:http://blog.csdn.net/ruyanhai/archive/2007/11/07/1871663.aspx ◆ 一般情况下,我们都使用相对路径来获取资 ...

  3. CSS中Position定位属性的使用

    文章目录 CSS中定位属性的使用 position:absolute position:relative position:fixed position:sticky position:static ...

  4. 程序化物件放置(procedural placement)之泊松硬盘采样(poisson disk sampling)

    程序化物件放置(Procedural Placement) 在开放世界游戏中, 很多小物件(物品箱子, 杂物, 草,木桶)的摆放是很耗费工作量的, 靠人工手动摆放是不现实的,为了节省工作量, 工程师探 ...

  5. MySQL 5.6中如何定位DDL被阻塞的问题

    在上一篇文章<MySQL 5.7中如何定位DDL被阻塞的问题>中,对于DDL被阻塞问题的定位,我们主要是基于MySQL 5.7新引入的performance_schema.metadata ...

  6. CMRNet++:一种相机在激光雷达构建地图中的定位方案

    点云PCL免费知识星球,点云论文速读. 标题:CMRNet++: Map and Camera Agnostic Monocular Visual Localization in LiDAR Maps ...

  7. 标准h5的定位_H5中的定位

    这次给大家带来H5中的定位,H5中定位的注意事项有哪些,下面就是实战案例,一起来看一下. 一.定位流分类 1.1相对定位 1.2绝对定位 1.3固定定位 1.4静态定位 二.什么是相对定位? 相对定位 ...

  8. 漫谈 ClickHouse 在实时分析系统中的定位与作用

    ClickHouse 是一款由俄罗斯Yandex公司开源的OLAP数据库,拥有着卓越的性能表现,在官方公布的基准测试中,ClickHouse的平均响应速度是Vertica的2.63倍.InfiniDB ...

  9. 基于激光雷达的里程计及3D点云地图中的定位方法

    本文转载自公众号@点云PCL,基于激光雷达的里程计及3D点云地图中的定位方法 :https://mp.weixin.qq.com/s/laA1YAPBCpqlzdGi0yb2cQ 论文:LOL: Li ...

最新文章

  1. Flatten Nested Arrays(展平嵌套数组)
  2. 在VSO8中使用QT
  3. Google Apps – Framework, Phonesky, GmsCore w/ AOSP Build.
  4. Ionic Mac 环境配置
  5. java中修改密码_java怎样修改用户名密码?
  6. redis 安装配置
  7. Python内置函数(49)——isinstance
  8. 双栏模板图片标题无法居中_没想到吧,只用一张图片,你就可以做一份PPT!
  9. SUMIFS函数多条件求和的9个实例【转载】
  10. js中点击按钮时变色,松开后恢复原来的颜色
  11. 冲突域和广播域,中继器、集线器、网桥、交换机、路由器和网关
  12. 适合学龄前孩子看的动画片 小蜜蜂(蜂来乐)值得推荐
  13. c语言程序设计入门教程视频教学
  14. Unity-射线检测
  15. 字符串中单词分别逆序
  16. 数字故宫(360全景+纪录片+数据库+公开课)
  17. Ubuntu 蓝屏拯救
  18. xd生成html,7款Adobe XD必备插件
  19. 【问题解决】关于 C++ 连接 Redis 集群报错 MOVED
  20. 【硅谷银行】硅谷银行倒闭事件

热门文章

  1. bmon:一个强大的网络带宽监视和调试工具
  2. 初识Mysql(一)
  3. 读书笔记2013第3本:《无价》
  4. 机器学习自主解决安全威胁离我们还有多远?
  5. sharepoint 2013基于AD的Form表单登录(三)——选择用户时,屏蔽掉AD。
  6. DreamWeaver连接Tomcat用以编辑和测试JSP
  7. 【struts2】Struts2的运行流程
  8. 远程连接server问题
  9. Android应用开发—FragmentManager如何管理fragments
  10. mysql5.6 memcached_MySQL 5.6 安装配置InnoDB memcached Plugin