在指定内存上创建对象——placement new机制

2023-11-15

一、介绍

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间,申请所得空间的位置是随机的。但是,在某些特殊情况下,可能需要在已分配的特定内存创建对象(比如内存池),这就是所谓的“定位放置new”(placement new)操作。

定位放置new操作的语法形式不同于普通的new操作。例如,一般都用如下语句A* p=new A;申请空间,而定位放置new操作则使用如下语句:

A* p = new (ptr)A

来申请空间,其中ptr就是程序员指定的内存首地址。使用之后,要显示的调用对象的析构函数来释放内存。

二、实例

#include <iostream>
using namespace std;

class A
{
public:
    A()
    {
        cout << "A's constructor" << endl;
    }


    ~A()
    {
        cout << "A's destructor" << endl;
    }

    void show()
    {
        cout << "num:" << num << endl;
    }

private:
    int num;
};

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; // 在已分配的内存上创建对象A
    cout << p << endl;
    p->show();
    p->~A();
    system("pause");
    return 0;
}

打印

 

1)用定位放置new操作,既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。如本例就是在栈上生成一个对象。

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

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

参考:

placement new机制 - 知乎

[C++]记一次由placement new引发内存泄露的惨痛教训_若_思的博客-CSDN博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在指定内存上创建对象——placement new机制 的相关文章

随机推荐

  • 【Inno Setup】判别系统版本

    Code function IsXP32 Boolean var Version TWindowsVersion S String begin GetWindowsVersionEx Version S 主版本号 IntToStr Vers
  • python文本进度条练习之不同速度进度条

    这属于一个小小的课后练习 但我在网上没有找到对应代码 我主要是在textprobarv3 py上做修改 我选择的是power设计 f x pow x 1 x 0 03 2 主要增加了一行 fx int pow i 1 i 0 03 2 修改
  • 线程池 vs 信号量的优缺点比较

    通常我们都采用基于线程池的实现方式 这也是最容易理解的方案 Hystrix还提供了另一种底层实现 那就是信号量隔离 小时候我们就知道 红灯停 绿灯行 跟着交通信号的指示过马路 信号量也是这么一种放行 禁行的开关作用 它和线程池技术一样 控制
  • 目标检测识别中,mAP,AP,P值的定义与计算

    mAP是衡量模型在所有类别上的准确率 是衡量模型的好坏的评价指标 mAP 所有类别的AP之和 类别数 AP是某一个类别的准确率 AP 每张图片的P之和 图片数量 P 一张图片上某一类别识别的正确数量 一张图片上某一类别的总数量 比如现在有三
  • drwxr-x-w-. 4 507 509 4.0K 9月 4 2018 wukong linux中 507和509 是什么回事?

    第一个数字507出现原因 表示该目录的所有者 不存在了 第二个数字509出现原因 表示该目录的所有者所在的组 不存在了
  • 【办公类-19-03】办公中的思考——Python批量制作word单元格照片和文字(小照片系列)

    背景需求 工会老师求助 如何在word里面插入4 8的框 我怎么也拉不到4 8大小 她用的是我WORD 文本框 我一听 这又是要手动反复黏贴 文本框 照片 文字 的节奏哦 我问 你要做几个人 超过20个 我写个程序批量插图 写代码测试要费时
  • 5.2lua setfenv

    local FuncEnv setmetatable FuncEnv index G local func loadfile a lua local func loadfile a lua nil FuncEnv local ENV Fun
  • 二分查找法

    二分查找法 1 基础二分查找 2 改进二分查找 3 平衡版二分查找法 4 查找目标值最左索引 5 查找目标值最右索引 6 查找大于等于目标值的最左索引 7 查找小于等于目标的最右索引值 1 基础二分查找 二分查找法 基础 public st
  • mysql系统错误216_MySQL异常 - Skqing - OSCHINA - 中文开源技术交流社区

    jdbc mysql localhost 3306 ry useUnicode true characterEncoding utf8 zeroDateTimeBehavior convertToNull useSSL true Druid
  • 【扫盲】机器学习图像处理中的深层/浅层、局部/全局特征

    浅层网络与深层网络浅层网络更注重于细节信息 深层网络更注重于语义信息 浅层网络 一般感受野较小 能够利用更多的细粒度特征信息 而且此时特征图每个像素点对应的感受野重叠区域还很小 这就保证了网络能够捕获更多细节 深层网络 随着下采样或卷积次数
  • 常见黑客渗透测试工具

    因为上面要转了一篇 里面好多我都觉得过时了 不过确实好多我也还在用 哈哈 留个备份吧 免得上面又要找我要 一 Nessus 是扫描UNIX漏洞的主力工具 随后栖身Windows 主要功能包括本地和远程安全审查 支持client server
  • 10亿个数字,内存限制100M,进行排序

    解题思路 分治法 拆分小文件 先对每个小文件进行排序 然后使用小顶堆或大顶堆合并文件 代码 python3 import threading from queue import Queue import time import random
  • 小程序页面收录sitemap.json的作用与使用方法

    desc 关于本文件的更多信息 请参考文档 https developers weixin qq com miniprogram dev framework sitemap html rules action allow page 微信现已
  • 毕业设计-基于GUI的模拟电路故障诊断仿真平台研究- Matlab

    目录 前言 课题背景和意义 实现技术思路 一 联合仿真平台设计与实现 二 系统测试 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要
  • MySQL运行原理与基础架构

    1 MySQL基础 MySQL是一个开放源代码的关系数据库管理系统 原开发者为瑞典的MySQL AB公司 最早是在2001年MySQL3 23进入到管理员的视野并在之后获得广泛的应用 2008年MySQL公司被Sun公司收购并发布了首个收购
  • APP违法违规收集使用个人信息行为认定方法

    没有公开收集使用规则的情形 在App中没有隐私政策 或者隐私政策中没有收集使用个人信息规则 解读 APP内无法找到隐私政策或隐私政策内没有包含该APP收集使用个人信息的规则 在App首次运行时未通过弹窗等明显方式提示用户阅读隐私政策等收集使
  • 【Python】删除USB网络共享在win系统中递增的网络x

    删除之后还是挺干净的 软件环境 windows python3 winreg模块 自带 如果是python2请修改为 winreg 前置知识 所有已保存的网络存储HKEY LOCAL MACHINE SOFTWARE Microsoft W
  • Hive表的几种存储格式及在性能调优应用

    一 理论知识学习 底层决定上层建筑 此部分内容引用了 Hive表的几种存储格式 海贼王一样的男人 博客园 Hive的文件存储格式 textFile textFile为默认格式 存储方式 行存储 缺点 磁盘开销大 数据解析开销大 压缩的tex
  • QT background-color: transparent

    改行代码的作用是可以把背景颜色设为透明 transparent 是默认的 background color transparent 别小看这个 这个 css 代码 在 qt 样式表里应用 可以实现挺好看的效果 如果你遇到有些字体被背景颜色遮
  • 在指定内存上创建对象——placement new机制

    一 介绍 一般来说 使用new申请空间时 是从系统的 堆 heap 中分配空间 申请所得空间的位置是随机的 但是 在某些特殊情况下 可能需要在已分配的特定内存创建对象 比如内存池 这就是所谓的 定位放置new placement new 操