• 【C++】之内存管理 - new/delete


    目录

    一.new/delete用法规则

    1.对于内置类型

    2.对于自定义类型

    3.new/delete与malloc/free的区别

    二.new/delete的实现原理

    三.总结


    一.new/delete用法规则

    1.对于内置类型

    1. //1.在堆上开辟空间但不初始化
    2. int* p1 = new int;
    3. //2.在堆上开辟空间的同时初始化
    4. int* p2 = new int(10);
    5. //3.在堆上开辟10个连续的int空间但不初始化
    6. int* p3 = new int[10];
    7. //4.在C++11规定,可以给连续空间开辟的同时初始化
    8. int* p4 = new int[10]{ 1,2,3,4,5,6,7,8,9,10 };
    9. //5.清理并且释放空间
    10. delete p1;
    11. delete p2;
    12. delete[] p3;
    13. delete[] p4;

    对于内置类型而言,malloc/new、free/delete并没有本质上的区别,如果开辟连续空间使用delete直接清理并释放的话不一定会报错,但建议配套使用new/delete、new[]/delete[] 

    2.对于自定义类型

    1. class Date
    2. {
    3. public:
    4. Date(int year = 1, int month = 1, int day = 1)
    5. :_year(year),_month(month),_day(day)
    6. {}
    7. private:
    8. int _year;
    9. int _month;
    10. int _day;
    11. };
    12. int main()
    13. {
    14. //对于自定义类型
    15. //1.在堆上开辟空间但不初始化,自动调用默认构造
    16. Date* dp1 = new Date;
    17. //2.在堆上开辟空间的同时初始化,调用构造函数
    18. Date* dp2 = new Date(2022, 8, 14);
    19. //3.在堆上开辟10个连续的int空间但不初始化,自动调用10次默认构造
    20. Date* dp3 = new Date[10];
    21. //4.在C++11规定,可以给连续空间开辟的同时初始化,调用10次构造函数
    22. //两种方式
    23. Date* dp4 = new Date[10]{ Date(1,1,1),Date(2,2,2),Date(3,3,3),\
    24. Date(4,4,4),Date(5,5,5),Date(6,6,6),\
    25. { 7, 7, 7 }, { 8, 8, 8 }, { 9, 9, 9 }, { 10,10,10 } };
    26. delete dp1;
    27. delete dp2;
    28. delete[] dp3;
    29. delete[] dp4;
    30. return 0;
    31. }

    对于自定义类型而言,必须严格遵守new/delete、new[]/delete[]配套使用,否则一定报错

    3.new/delete与malloc/free的区别

    1.体现在对于自定义类型的处理不同

    对于自定义类型new会做两件事

    1).在堆上申请空间 2).调用构造函数初始化

    对于自定义类型delete会做两件事

    1).调用析构函数清理对象中的资源 2).释放空间

    结论:new/delete就是为自定义类型准备的!

    2.体现在对于开辟空间失败的处理不同

    1).malloc失败直接返回NULL

    2).new失败,需要检查返回值,抛出异常

    二.new/delete的实现原理

    从汇编角度来看new的底层调用了operator new与构造函数,而operator new的底层实际调用的malloc ,那么operator new与malloc最大的区别,实际本质上operator new是在malloc的基础上封装了一层异常处理;delete的底层则是调用了operator delete与析构函数。实际上new/delete的空间是由malloc开辟,由free释放。

    三.总结

    new/malloc、delete/free的区别

    对于内置类型

    无本质区别,唯一的区别就是new开辟失败抛异常,malloc开辟失败返回NULL

    对于自定义类型

    new

            1.调用operator new

            2.调用构造

    delete

            1.调用析构

            2.调用operator delete

    关系图

  • 相关阅读:
    mybatisplus配置
    【洛谷 P1104】生日 题解(结构体排序+稳定排序)
    快收藏!最适合计算机大学生的Java毕业设计项目--音乐视频网站系统!
    kubernetes CNI(Container Network Inferface)
    左孩子右兄弟(2023寒假每日一题 18)
    LogRhythm UEBA——AI Engine Rules
    想法子记忆Vi/Vim常用操作及指令
    vscode离线下载对应版本的插件,避免版本兼容问题
    【从0到1设计一个网关】过滤器链的实现---实现负载均衡过滤器
    NodeJS @kubernetes/client-node连接到kubernetes集群的方法
  • 原文地址:https://blog.csdn.net/Hello_World_213/article/details/126333285