关闭

使用new时的初始化问题

标签: C++
312人阅读 评论(0) 收藏 举报
分类:
变量定义及使用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。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:230260次
    • 积分:2998
    • 等级:
    • 排名:第11746名
    • 原创:66篇
    • 转载:199篇
    • 译文:1篇
    • 评论:29条
    文章分类