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。

  • 相关阅读:
    二、跳转指定页面的JS代码
    一、常规的JS页面跳转代码
    您在前一家公司的离职原因是什么?
    如果你在这次面试中没有被录用,你怎么打算?
    如果你在这次面试中没有被录用,你怎么打算?
    针对你们单位业务工作中出现的问题,你提出了一些很好的建议,得到了同事们的赞同,但你的领导并不满意。在这种情况下,你怎么办?
    进程与线程的区别
    work13
    work12
    day09
  • 原文地址:https://www.cnblogs.com/xzzzh/p/6736647.html
Copyright © 2011-2022 走看看