zoukankan      html  css  js  c++  java
  • 关于C++的new是否会对内存初始化的问题

    先把结论放上来:

    C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

    以下代码:

    #include <iostream>

    using namespace std;

    int main()
    {
        int *a=new int[1000];
        for(int i=0;i<1000;i++){
            a[i]=i+1;
        }
        delete[] a;
        int *b=new int[1000];
        for(int i=0;i<100;i++){
            cout<<b[i]<<endl;
        }

        return 0;
    }

    没有初始化,输出的结果是:

    9437380

    9443448

    3

    4

    5

    6

    。。。

    可见,new操作符并没有对内存进行初始化。

    而稍微改变一下代码(在new之后添加括号()):

    #include <iostream>

    using namespace std;

    int main()
    {
        int *a=new int[1000];
        for(int i=0;i<1000;i++){
            a[i]=i+1;
        }
        delete[] a;
        int *b=new int[1000]();
        for(int i=0;i<100;i++){
            cout<<b[i]<<endl;
        }

        return 0;
    }

    输出结果为:

    0

    0

    0

    0

    。。

    可见,已经进行了初始化。

     =============================================================================

    进一步思考:

    定义类A:

    class A{
    public:
        int a;
        A():a(10){};
    };

    main函数中使用语句:

        A *b=new A;
        cout<<b->a<<endl;

        A *b=new A();
        cout<<b->a<<endl;

    输出结果都是10,可见都进行了初始化。

    但是,如果吧A的构造函数删掉,则两个语句输出的结果分别是:随机数,0。

    由此可见,C++在new时的初始化的规律可能为:对于有构造函数的类,不论有没有括号,都用构造函数进行初始化;如果没有构造函数,则不加括号的new只分配内存空间,不进行内存的初始化,而加了括号的new会在分配内存的同时初始化为0。

  • 相关阅读:
    不拖控件的asp.net编程方法——第1回
    实习的故事之——第7天
    最近遇到的问题总结!
    实习的故事之——第5天
    asp.net MVC最简单的增删查改!(详)
    实习的故事之——第3天
    如何去除CFormView的Scrollbar
    Mac java环境配置
    【Kafka入门】Kafka基础结构和知识
    [原创]git使用入门
  • 原文地址:https://www.cnblogs.com/xzzzh/p/6736647.html
Copyright © 2011-2022 走看看