C++ 布置new 布局new placement new

这篇具有很好参考价值的文章主要介绍了C++ 布置new 布局new placement new。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++ 布置new 布局new placement new

new操作符(operator new)的语法

new操作符(operator new), 在头文件#include <new> 定义。

主要包括以下几类:

  1. 可替换的分配函数 void* operator new ( std::size_t count );,如T* p1 = new T;
  2. 可替换的不抛出分配函数 void* operator new ( std::size_t count, const std::nothrow_t& tag );
  3. 不分配布置分配函数 void* operator new ( std::size_t count, void* ptr );,如T* p2 = new (p1)T
  4. 用户定义布置分配函数 void* operator new ( std::size_t count, 用户定义实参... );
  5. 类特定分配函数 void* T::operator new ( std::size_t count );
  6. 类特定布置分配函数 void* T::operator new ( std::size_t count, 用户定义实参... );
参数 含义
count 要分配的字节数
ptr 指向要初始化的对象所在的内存区域的指针
tag 用于选择不抛出重载的消歧义标签

示例代码

#include <new>
#include <stdio.h>

class T {
public:
  T() { printf("T::T()\n"); };
  T(int n) { printf("T::T(int n)\n"); };
  ~T() { printf("T::~T()\n"); };
};

int main() {
  T *p1 = new T; // 

  p1->~T();
  T *p2 = new (p1) T(2); // do not delete p2

  delete p1;
  p1 = nullptr;

  return 0;
}

执行结果

T::T()
T::~T()
T::T(int n)
T::~T()

布置new (placement new)

普通new是在堆(heap)上分配空间。

布置new(placement new)不申请空间,而是在已分配的空间上创建对象。

new/delete的过程

// new
void *ptr = malloc(sizeof(T)*1); // malloc分配空间
T* t = new(ptr)T; // 已分配空间上创建对象 - 布置new(placement new)

// delete
t->~T(); // 析构
free(ptr); // free释放空间

布置new(placement new)的注意事项

  1. 布置new(placement new)所使用的的空间,可以是堆(heap)空间,也可以是栈(stack)空间
  2. 由于布置new(placement new)并没有申请空间,在已分配空间上调用构造函数,因此需要显示调用析构函数
  3. 由于布置new(placement new)并没有申请空间,因此delete应该由原来分配空间的地方进行调用

License

License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎


Reference:文章来源地址https://www.toymoban.com/news/detail-684017.html

  1. operator new - cppreference.com
  2. new expression - cppreference.com
  3. Union declaration - cppreference.com

到了这里,关于C++ 布置new 布局new placement new的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM面试题-JVM对象的创建过程、内存分配、内存布局、访问定位等问题详解

    内存分配的两种方式 指针碰撞 适用场合:堆内存 规整 (即没有内存碎片)的情况下。 原理:用过的内存全部整合到一边,没有用过的内存放在另一边,中间有一个分界指针,只需要向着没用过的内存方向将该指针移动对象内存大小位置即可。 使用该分配方式的GC收集器:

    2024年02月08日
    浏览(40)
  • C++用new创建动态数组

    如果通过像下面这样一般的方法来声明数组,则在程序编译的时候为其分配内存,不管程序最终是否用到这个数组,数组都在那里并占用内存,即静态联编。但是如果使用new,则在运行阶段需要它才进行创建,不需要则不创建,这叫动态联编,这种创建的数组叫做动态数组。

    2024年02月09日
    浏览(25)
  • 【Java虚拟机学习2】HotSpot虚拟机下对象的创建及在Java堆中对象的内存分配、布局和对象的访问

    对象的生命周期主要分为创建、使用、销毁这三大阶段。从它被创建的一刻开始,到它被垃圾收集器(Garbage Collector)回收的一刻结束 对象的创建 。包括:1、类的加载 2、内存的分配 3、初始化零值 4、设置对象头 5、执行init方法(具体操作步骤请看上述内容,其中步骤1的类

    2024年02月16日
    浏览(32)
  • Golang中的New和Make:内存分配与初始化的区别

    摘要:本文将深入探讨Golang中的 New 和 Make 函数在内存分配和初始化方面的区别。我们将通过理论阐述和示例代码来解释这两个函数的作用,并帮助读者更好地理解它们在实际编程中的应用。 在Golang中, New 和 Make 是用于内存分配和初始化的重要函数。虽然它们都涉及到内存

    2024年02月08日
    浏览(28)
  • C语言的动态分配空间&&C++的动态分配空间问题

    C:1、malloc 2、calloc C++:new运算符 malloc(): 这个函数用于分配一块指定大小的内存块,并返回一个指向该内存块的指针。语法如下: 释放分配空间 calloc 是 C 语言中用于动态分配内存的另一个函数,与 malloc 类似,但有一些区别。calloc 用于分配一块指定数量和大小的连续内存

    2024年02月13日
    浏览(22)
  • 小红书达人矩阵怎么布局,达人矩阵分配

    随着互联网营销学的兴起,一方面使得生意越来越好做,但同时也加大了做生意的门槛,属于是良币驱逐劣币。而达人矩阵就是良币的一种表现方式,今天来和大家来分享下小红书达人矩阵怎么布局,达人矩阵分配。 达人矩阵是什么? 这是指根据品牌所属阶段以及用户群体画

    2024年02月15日
    浏览(25)
  • 新手小白安装aio小主机布置家庭网络-4-proxmox-ve安装LXC、pve创建ct容器安装docker。

    PVE是使用Debian系统作为底层。我们创建Debian LXC容器。 下载Debian11DE  ct模板 创建CT,一定把无特权容器前面的勾去掉。我们需要一个特权的容器。勾选嵌套。完成后不要启动! 。 开启ct102容器前,进入pve shell 设置ct102容器设置 添加代码 ctrl+x保存配置,y确认,回车。

    2024年02月15日
    浏览(35)
  • C++实战Opencv第二天——色彩空间转换函数和opencv中图像对象创建与赋值(从零开始,保姆教学)

    OpenCV是一个强大的计算机视觉库,使用C++作为主要编程语言,对于图像处理和计算机视觉领域具有重要意义。其提供了丰富的功能和算法,使得开发者能够快速实现各种图像处理和计算机视觉应用。OpenCV C++为图像处理和计算机视觉领域的开发者提供了一个高效、稳定的工具。

    2024年02月20日
    浏览(32)
  • JVM 给对象分配内存空间

    指针碰撞 空闲列表 TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞:(Bump The Pointer) 堆的内存是绝对规整的,内存主要分为两部分,所有使用过的内存被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点

    2024年02月11日
    浏览(27)
  • Ubuntu用gparted重新分配空间

    ubuntu系统使用过程中安装系统时预先留的空间不够使用怎么办? 这么办! 首先 使用 df -h 查看当前空间使用情况 先将已分配的空间中的多余空间分离出来; 假设我想将挂载点/home下的一部分空间分给挂载点/ 操作如下: 安装gparted工具 启动工具 gparted 软件说明 图中小锁 表示

    2024年01月23日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包