• 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

    这两句话是两个意思

  • 相关阅读:
    每日一道力扣题
    Hive External Table 外部表
    38-Java方法的参数传递机制:值传递
    RabbitMQ的5种模式——再探RabbitMQ的模式,简单、工作,发布订阅(广播),路由、主题 & 页面分析
    java+springboot基于性别网上学习特征问卷调查及可视化系统
    [华为认证]路由表和FIB表
    环境保护监测系统
    面试时总被问,你认为项目管理最难的什么?
    安杰思提交注册:预计2022年度收入不低于3.5亿元,同比增长15%
    Java基础面向对象介绍
  • 原文地址:https://blog.csdn.net/tr_ainiyangyang/article/details/125626965