C++内存管理:其三、new和delete的行为拆分

new和delete都是C++的关键字,不可重载。其底层的行为可以看作多个函数的组合。

一、自己实现new与delete的功能

cpp 复制代码
#include <iostream>
using namespace std;

class Student{
private:
    int age{24};
public:
    Student(){
        cout<<"start"<<endl;
    }

    ~Student(){
        cout<<"end"<<endl;
    }

    void f(){
        cout<<"age = "<<age<<endl;
    }
};

int main(void) {
    Student * p = (Student *)operator new(sizeof(Student));    //自己实现new
    new(p) Student;

    p->f();

    p->~Student();          //自己实现delete
    operator delete(p);

    return 0;
}

第一行:

Student * p = (Student *)operator new(sizeof(Student));

operator new是C++自带的函数,可以重载。准确调用方法是:

::operator new(sizeof(Student));

::表示全局命名空间,注意不是std::标准命名空间!

底层调用的是malloc函数,实际上返回的是void * 指针。参数表示要申请的字节数。

第二行:

new§ Student;

表示在给定的地址(堆上地址)执行构造函数。

对应delete的操作:

p->~Student();表示在某个地址上执行析构函数。

operator delete§;

调用的是C++自带的函数,同样可以重载。底层调用的是free()函数。

二、operator new和operator delete重载

相关推荐
GesLuck5 分钟前
C#开发实例1—彩票选号
开发语言·c#
每天写点bug12 分钟前
【golang】map遍历注意事项
开发语言·算法·golang
海螺姑娘的小魏15 分钟前
Effective C++ 条款 26:尽可能延后变量定义式的出现时间
开发语言·c++
橙子家czzj16 分钟前
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
java·开发语言·kubernetes
w(゚Д゚)w吓洗宝宝了21 分钟前
C++ 环境搭建 - 安装编译器、IDE选择
开发语言·c++·ide
程序员JerrySUN25 分钟前
BitBake 执行流程深度解析:从理论到实践
linux·开发语言·嵌入式硬件·算法·架构
云:31 分钟前
寒假准备找实习复习java基础-day1
java·开发语言
罗政43 分钟前
PDF书籍《手写调用链监控APM系统-Java版》第11章 插件与链路的结合:HttpClient插件实现跨进程传输TraceSegment
java·开发语言·pdf
王老师青少年编程1 小时前
gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
数据结构·c++·算法·gesp·csp·信奥赛
是小崔啊1 小时前
JVM -垃圾回收机制
java·开发语言·jvm