• 2.16 C++类与new和delete操作符


    参考: http://www.weixueyuan.net/view/6347.html

    总结:

      

    当我们需要为类对象动态分配存储空间时,我们应该使用C++语言提供的new与new[]操作符,而不要使用C语言提供的malloc函数

    虽然malloc函数具有分配存储空间的功能,但是这些函数除了分配存储空间外,不会调用类的构造函数。而C++语言提供的new和new[]操作符则不会如此,使用它们为对象分配存储空间的同时,它们也会调用相应的构造函数。

    操作符delete和delete[]在释放对象存储空间的同时也会调用析构函数,而free函数则不会调用析构函数。

    例1:

    #include<iostream>
    using namespace std;
    
    class test
    {
    public:
        test(int i = 1){num = i;cout<<num<<" Constructor"<<endl;}
        ~test(){cout<<num<<" Destructor"<<endl;}
    private:
        int num;
    };
    
    int main()
    {
        test * t0 = new test(0);
        test * t1 = new test[5];
        test * t2 = (test *)malloc(sizeof(test));
        delete t0;
        delete[] t1;
        free(t2);
        return 0;
    }

    程序运行结果:

    0 Constructor
    1 Constructor
    1 Constructor
    1 Constructor
    1 Constructor
    1 Constructor
    0 Destructor
    1 Destructor
    1 Destructor
    1 Destructor
    1 Destructor
    1 Destructor

    从程序运行结果不难看出malloc确实没有调用构造函数,free也没有调用析构函数。在这里可能有人会觉得这没有遵循析构函数调用顺序,其实不是这样的,因为我们在delete t0;的语句的时候就已经要求编译器销毁t0对象了,此时其它对象还处于存活期,因此t0先走一步,调用析构函数。之后再销毁t1所指向的对象数组。

  • 相关阅读:
    QT学习笔记——06-Day16_C++_QT
    QT学习笔记——06-Day15_C++_QT
    QT学习笔记——06-Day14_C++_QT
    c++提高学习笔记——05-c++STLday13_贪吃蛇案例
    c++提高学习笔记——05-c++STLday12
    c++提高学习笔记——05-c++STLday11
    混子的 后缀数组 刷题记录
    POJ2528Mayor's posters 线段树,离散化技巧
    莫比乌斯反演 刷题记录
    P问题,NP问题,NPC问题学习笔记
  • 原文地址:https://www.cnblogs.com/yongpan/p/7504292.html
Copyright © 2020-2023  润新知