zoukankan      html  css  js  c++  java
  • 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所指向的对象数组。

  • 相关阅读:
    python3 访问 rabbitmq 示例
    centos7 GNOME 安装微信客户端
    使用 rm -rf 删除了工程目录,然后从 pycharm 中找了回来
    主动做事,做一个靠谱的人
    Go net/http 发送常见的 http 请求
    学会感激,才能长大
    Go context 介绍和使用
    xargs 命令
    Docker 镜像 && 容器的基本操作
    CentOS && Ubuntu 环境下 Docker 的安装配置
  • 原文地址:https://www.cnblogs.com/yongpan/p/7504292.html
Copyright © 2011-2022 走看看