首页 > 系统相关 >C++内存分配揭秘:new操作符::operator new和Placement new的区别

C++内存分配揭秘:new操作符::operator new和Placement new的区别

时间:2024-01-18 09:22:23浏览次数:24  
标签:调用 Placement C++ 内存 MyClass operator new 构造函数

 

在 C++ 中,new 操作符、::operator new 和 placement new 是用于动态内存分配的工具,但它们有不同的用法和行为。以下是它们的区别和用法的详细实例:

1.new操作符

new 操作符用于在堆上动态分配内存,并调用对象的构造函数初始化对象。

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass 构造函数" << std::endl;
    }

    ~MyClass() {
        std::cout << "MyClass 析构函数" << std::endl;
    }
};

int main() {
    // 使用 new 操作符动态分配一个 MyClass 对象
    MyClass* myObject = new MyClass();

    // 使用完后需要手动释放内存
    delete myObject;

    return 0;
}

2.::operator new

::operator new 是 C++ 中的全局函数,用于分配内存,但不会调用对象的构造函数。它返回分配的内存的指针。

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass 构造函数" << std::endl;
    }

    ~MyClass() {
        std::cout << "MyClass 析构函数" << std::endl;
    }
};

int main() {
    // 使用 ::operator new 分配内存
    void* rawMemory = ::operator new(sizeof(MyClass));

    // 在已分配的内存上调用构造函数
    MyClass* myObject = new (rawMemory) MyClass();

    // 使用完后手动调用析构函数
    myObject->~MyClass();

    // 释放内存
    ::operator delete(rawMemory);

    return 0;
}

3. Placement new

Placement new 是使用 new 操作符的变种,允许在预分配的内存上调用构造函数,类似于 ::operator new 的用法。

#include <iostream>

class MyClass {
public:
    MyClass() {
        std::cout << "MyClass 构造函数" << std::endl;
    }

    ~MyClass() {
        std::cout << "MyClass 析构函数" << std::endl;
    }
};

int main() {
    // 预分配内存
    char buffer[sizeof(MyClass)];

    // 使用 placement new 在预分配的内存上调用构造函数
    MyClass* myObject = new (buffer) MyClass();

    // 使用完后手动调用析构函数
    myObject->~MyClass();

    return 0;
}

区别总结:

  • new 操作符:
    • 动态分配内存,并调用对象的构造函数。
    • 使用 delete 释放内存,并调用对象的析构函数。
  • ::operator new:
    • 只分配内存,不调用对象的构造函数。
    • 使用 ::operator delete 释放内存,不调用对象的析构函数。
  • Placement new:
    • 使用 new 操作符的变种,在指定的内存位置调用构造函数。
    • 需要手动调用析构函数,并在适当时机释放内存。

选择使用哪种方式取决于具体的需求,例如是否需要构造和析构函数的调用,是否需要手动管理内存释放等。

 

标签:调用,Placement,C++,内存,MyClass,operator,new,构造函数
From: https://www.cnblogs.com/hanbing81868164/p/17971761

相关文章

  • Qt/C++自定义界面大全/20套精美皮肤/26套精美UI界面/一键换肤/自定义颜色/各种导航界
    一、前言这个系列对应自定义控件大全,一个专注于控件的编写,一个专注于UI界面的编写,程序员有两大软肋,一个是忌讳别人说自己的程序很烂很多bug,一个就是不擅长UI,基本上配色就直接rgb,对于第一点,只要放松心态,直面自己的不足,不断改进,才能问鼎武林至尊。至于第二点,因为程序员擅长的是逻辑......
  • C++继承顺序
    派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为private。我们可以根据访问权限总结出不同的访问类型,如下所示:访问publicprotectedprivate同一个类yesyesyes派生类yesyesno外部的类yesnono......
  • 猫狗收容所 C++
    #include<iostream>#include<queue>usingnamespacestd;voiddelect(queue<int>*q,intx){if(q->empty())return;for(inti=0;i<q->size();i++){intt=q->front();q->pop();if(t!=x)q->push......
  • C++开发基础
    软件开发基础2024-01-0820:13星期一博客内容来自相关书籍和网站内容总结,仅供个人参考使用:笔者@东北大学StuBoo使用目录快速转到面试问题汇总、常见算法问题1.C++语言基础1.1C++语言特性概览面向对象编程(OOP):C++支持面向对象编程,包括封装、继承和多态。通过类和对象,可......
  • c++开发面试Q&A
    面试问题Q&A现阶段问题还没有归类,等待更新C++语言基础QC和C++两者优缺点,适合情况C语言特点:优点:简洁、高效、可移植性强、面向过程、底层控制、资源利用高。适用情况:嵌入式系统、操作系统、编译器、硬件驱动开发、对性能要求高的系统。C++语言特点:优点:面向对象、支持......
  • 3254:约瑟夫问题No.2C++
    \这题思路还是挺多的。如果用数学的角度考虑。知道了n,p,m自然就知道下一个要出队的人的编号。然后一个个输出就行了。还可以用循环链表做。还可以用队列。出队在入队。#include<iostream>#include<queue>usingnamespacestd;intmain(){intn,p,m;while(......
  • C++ 面试题
    目录构造函数不能声明为虚函数虚函数表是如何在C++中被初始化的?虚函数表和虚函数指针在内存中的具体存储方式是什么?构造函数不能声明为虚函数在C++中,构造函数不能声明为虚函数。这是因为在执行类的构造函数时,内存中还没有虚表,也就是还没有定义虚指针。因此,构造函数必须始终是非......
  • C++中setw和setfill函数的结合应用
    一、头文件头文件为#include<iomanip>其中io代表输入输出,manip是manipulator(操纵器)的缩写iomanip的作用:主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样。二、setw函数s......
  • KY20 完数与盈数C++
    练习使用向量vector容器。遍历每个数取余就好了。然后记录下来。#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>B;vector<int>C;for(inti=2;i<=60;i++){vector<int>A;intm;......
  • C++ STL标准模板库
    目录简介容器(Containers)迭代器(Iterators)算法(Algorithms)函数对象(FunctionObjects)适配器(Adaptors)分配器(Allocators)std::min_element()简介C++中的STL(标准模板库)可以分为六个部分,分别是容器(Containers)、迭代器(Iterators)、算法(Algorithms)、函数对象(FunctionObjects)、适配器(Adapto......