码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • c++(14)new和delete


    1、new和delete成对使用

    2、malloc、free    和 new、delete这两个可以混合使用

    3、malloc、free    和 new、delete区别:malloc和free是函数,但new和delete是c++中的操作符。

    new还可以触发类对象的构造函数,malloc在这一点上缺失了一些实用性。

    同理delete也可以触发对象的析构函数,free不会调用对象的析构函数。

    这样的话可能会存在一个风险。比如下面的例子

    1. #include <iostream>
    2. #include <cstring>
    3. using namespace std;
    4. class teacher
    5. {
    6. public:
    7. teacher(int id, const char *name)
    8. {
    9. cout<<"teacher(int id, const char *name) ...."<<endl;
    10. m_id = id;
    11. m_name = new char[strlen(name)];
    12. if (NULL != m_name)
    13. {
    14. strcpy(m_name, name);
    15. }
    16. }
    17. void SetTeacher(int id, const char *name)
    18. {
    19. m_id = id;
    20. m_name = (char *)malloc(strlen(name));
    21. if (NULL != m_name)
    22. {
    23. strcpy(m_name, name);
    24. }
    25. strcpy(m_name, name);
    26. }
    27. ~teacher()
    28. {
    29. cout<<"~teacher() ...."<<endl;
    30. if (NULL != m_name)
    31. {
    32. delete m_name;
    33. }
    34. }
    35. void Pinrt()
    36. {
    37. cout<<"id="<<m_id<<", name="<<m_name<<endl;
    38. }
    39. teacher(const teacher &another)
    40. {
    41. m_id = another.m_id;
    42. m_name = new char[strlen(another.m_name)];
    43. if (NULL != m_name)
    44. {
    45. strcpy(m_name, another.m_name);
    46. }
    47. }
    48. private:
    49. int m_id;
    50. char *m_name;
    51. };
    52. int main(void)
    53. {
    54. teacher *pt1 = (teacher *)malloc(sizeof(teacher));
    55. pt1->SetTeacher(11, "li4");
    56. pt1->Pinrt();
    57. free(pt1);
    58. cout<<"------------------"<<endl;
    59. teacher *pt2 = new teacher(10, "zhang3");
    60. pt2->Pinrt();
    61. delete pt2;
    62. printf("\n");
    63. return 0;
    64. }

    执行的结果

     我们可以看到,当我们使用malloc的时候,想要初始化成员变量,还需要额外定义一个显示的Set函数去初始化成员变量。使用new则完全可以调用类的有参构造函数。

    上面仅仅是实用性上new比较方便,但是当free和delete的时候就发生的致命的错误。

    我们的成员变量里面有指针,使用free的时候,只能释放掉teacher *pt1所指向的空间,而pt1中的成员变量m_name也是一个指针,在SetTeacher时所申请的空间并没有释放掉,这样就造成了内存泄露。

    而delete pt2的时候,则会调用teacher类的析构函数,同时释放掉m_name所指向的空间。使内存不会泄露,达到保护的作用。

     

    补充:

    int *p = new int[10]; //在堆上申请10个int长度的空间

    int *p1=new int(10);//在堆上申请1个int长度的空间,并初始化值设为10

    这两句话是两个意思

  • 相关阅读:
    采用PHP开发的一套(项目源码)医疗安全(不良)事件报告系统源码:统计分析,持续整改,完成闭环管理
    软件设计不是CRUD(12):低耦合模块设计理论——业务抽象:模块分层操作
    loadrunner脚本--添加事务
    SpringBoot全局异常处理源码
    对抗生成网络GAN系列——GANomaly原理及源码解析
    上门按摩小程序|同城上门按摩软件开发|上门按摩系统;
    【Gitlab】01_基于docker部署gitlab及使用操作
    微服务架构的可观察性设计模式
    Sui发布RPC2.0 Beta,拥抱GraphQL并计划弃用JSON-RPC
    springboot-基础-eclipse配置+helloword示例
  • 原文地址:https://blog.csdn.net/tr_ainiyangyang/article/details/125626965
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号