关于C++中的placement new

初学者可能从来没听说过什么是 placement new。在国内有些地方会翻译为布置new 。而其作用主要是用于原位构造。

通常 new 操作是去向堆空间申请一块区域,而原位构造指的是在给出的指定目标进行构造。

具体的,我们来看下面的代码:

复制代码
#include <iostream>

struct Node {
    int num;
    Node(int _num) : num(_num) {
        std::printf("[%p] Node() num=%d\n", this, num);
    }

    ~Node() {
        std::printf("[%p] ~Node() num=%d\n", this, num);
    }
};

int main() {
    auto p = new Node(1);
    p      = new (p) Node(2);
    delete p;
}

输出结果为:

复制代码
[000002530bd01780] Node() num=1
[000002530bd01780] Node() num=2
[000002530bd01780] ~Node() num=2

可见构造函数调用了两次,析构调用了一次,且地址均相同。这就是对原始位置的操作。有了这一特性,能够非常方便的编写内存池以优化空间。

相关推荐
wzdark4 分钟前
算法与数据结构教学的可视化新模式探索4
数据结构
就叫年华吧丶8 分钟前
长文档点目录定位总是不准?一个 content-visibility + 平滑滚动引发的连环坑(Vue3 实战)
前端·javascript·算法·vue
FPGA信号处理15 分钟前
【信号检测与估计】第四节课:非高斯噪声下的 BLUE、极大似然与 EM 算法
人工智能·算法·机器学习
无名猿25 分钟前
nullptr 取代 NULL 和 0:空指针的三种写法和唯一正确解
c++·现代c++·语法基础·踩坑记录
大侠归来29 分钟前
C++ 与 Lua 的协程交互:从原理到实战
c++·lua·交互
无名猿37 分钟前
size_t 与 int 混用陷阱:有符号无符号比较与整数提升
c++·标准库·语法基础·踩坑记录
.道阻且长.41 分钟前
C++ 11:可变参数模板
前端·c++·算法
hzxpaipai43 分钟前
企业官网后台怎么设计?从产品分类、参数到资料下载的数据结构
数据结构
m0_380743871 小时前
Qt实现调用相机进行拍照并进行图像处理
开发语言·c++
励志不掉头发的内向程序员3 小时前
【从零写一个CAD 03】三个 double 值得单独一个类吗:把视图变换抽成 View
开发语言·c++·qt·学习·系统架构