使用new时的初始化问题

变量定义及使用new时的初始化问题_崔增旺_新浪博客
http://blog.sina.com.cn/s/blog_4a632b4d0101d25r.html

 
   在使用new分配内存单元时,一般希望新分配的单元能被初始化为全0。注意以下两条语句:
  C++ Code 
1
2
int  *ptrInt1  new  int                //新分配的内存单元里的值是未知
int  *ptrInt2  new  int();              //加上括号。新分配的内存单元里的值是全0
 
     例1:在 局部区域
  C++ Code 
1
2
3
4
5
void  main()
{
        int  *ptrInt1  new  int        //新分配的内存单元里的值是未知
        int  *ptrInt2  new  int();      //新分配的内存单元里的值是全0
}

     例2:在 局部区域内,初始化为指定值
  C++ Code 
1
2
3
4
5
void  main()
{
        int  *ptrInt1  new  int                                //新分配的内存单元里的值是未知
        int  *ptrInt2  new  int(0x12345678);          //新分配的内存单元里的值为12345678H
}

     在WIN32中,地址是一个无符号的双字,所以int* 类型的变量是一个双字大小的容器,里面用来装其所指向的内存单元的地址。从上图可以看出ptrInt1的值为003a4d08H,表示在用new int分配内存单元时,这个新的内存单元(其大小为一个双字,WIN32中int类型的单元要占32bit)的地址为003a4d08H。而由地址003a4d08H所指向的这个新分配的双字单元,里面的值为无意义的cdcdcdcdH。

      对于int *ptrInt2 = new int(0x12345678); ptrInt2的值为003a4d48H,且由地址003a4d48H所指向的这个新分配的双字单元,里面的值被初始化为12345678H。

      例3:在 局部区域内,分配数组
  C++ Code 
1
2
3
4
5
void  main()
{
        int  *ptrInt1  new  int[ 5];            //5个单元的值均未知(win32中,每个INT单元为一双字)
        int  *ptrInt2  new  int[ 5]();        //5个单元的值均为全0
}

     例4:在 全局区域内的情况跟在局部区域的以上情况都一样。(这跟普通的变量有区别)
  C++ Code 
1
2
3
4
5
6
7
int  *ptrInt1  new  int[ 5];            //内存单元里的值未知
int  *ptrInt2  new  int[ 5]();        //内存单元里的值均为0

void  main()
{

}

     例5:如果是普通变量,那么在局部区域内的默认初始值是未知,而在全局区域内的的默认初始值是全0。
  C++ Code 
1
2
3
4
5
6
7
8
int  var1[ 5];                        //5个单元的值为全0

void  main()
{
        int  var2[ 5];                //单元里的值未知
        int  var3[ 5{};      //通过这种方式可将单元里的值初始化为全0,
        //等价于int var3[5]={0}
}




/
/
/
关于C++的new是否会对内存初始化的问题 - 秋苍庸的专栏 - 博客频道 - CSDN.NET
http://blog.csdn.net/qiuchangyong/article/details/18410733

先把结论放上来:

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。


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值