使用new时的初始化问题

转载 2015年07月08日 14:47:27
变量定义及使用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。


相关文章推荐

c/c++ new与malloc的区别及使用时注意的问题

malloc 定义上:malloc  memory allocation 动态内存分配 是c中的一个函数 extern void *malloc(unsigned int num_bytes)...

关于android中使用new Message的内存泄露问题

我们在android上发消息的时候,使用Message msg=new Message() 后,发现整夜播放系统提示OOM,程序重启。将new Message()换成Message.obtain...

(2011.07.06)C++ 结构体中字符指针在main中使用new的赋值问题。

// 编程练习 04.01_display message_2.cpp /************************************************************...

C#控制台基础 使用new时,利用公有构造函数作为桥梁,应用this关键字,调用私有构造函数

镇场诗:慈心积善融学习,技术誓为大家学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 ——————————————————————————————————————————————...

memcpy 与new 开销,在大数据处理时谨慎使用指针

因为最经做些大数据处理的事情,主要是IP地址的处理, 拥有15G大小IP信息文件, 每条消息 IP,地区,服务商 把这些消息处理合并成 起始IP:结束IP 地区 ,服务商 在处理的工程中发现当处理1万...

Effective c++ 条款16学习笔记: 成对使用new和delete时要采取相同形式

User the same from in corresponding uses of new and deletes 条款16:User the same from in correspond...

VC 运行时库中的 new/delete 使用

No

C++之成对使用的new和delete时采取相同形式(16)---《Effective C++》

条款16:成对使用new和delete时候采取相同形式成对使用的new和delete需要采用相同的形式,可以先看如下代码:std::string* stringArray=new std::strin...

条款16:成对使用new和delete时要采取相同形式

条款16:成对使用new和delete时要采取相同形式
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)