使用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。


实例变量的初始化,构造器在new - 创建实例对象的时候,才会调用执行

class Student{     //成员变量     String name = initInstanceVar();     static int count = 0;     static...
  • u013470640
  • u013470640
  • 2014年01月22日 20:34
  • 907

new的初始化

有如下C++代码:int* buffer = new int[512];在默认情况下,new是不会对分配的int进行初始化的。要想使分配的int初始化为0,需要显式地调用其初始化函数:int* buf...
  • u012494876
  • u012494876
  • 2017年07月27日 22:32
  • 205

关于C++的new是否会对内存初始化的问题

原文地址:http://hi.baidu.com/maxy218/item/8cd098256327c1829d63d1ca 先把结论放上来: C++在new时的初始化的规律可能为:对...
  • qiuchangyong
  • qiuchangyong
  • 2014年01月17日 16:33
  • 8935

C++ new 动态数组初始化

动态数组初始化: 对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作: int *pia = new int[10]; // 每个元素都没有初始化 i...
  • hero_zyy
  • hero_zyy
  • 2015年11月07日 13:48
  • 12672

关于C++中用new申请动态数组的初始化的两种方式

在C++11中引进了这一新功能,即用new申请动态数组时可以直接初始化,形式如下:int* p = new int[cnt]();其中cnt长度和int类型都可以自己定义。 我发现的问题是: 在VC编...
  • mumu0627
  • mumu0627
  • 2016年12月29日 13:03
  • 2719

c++ 用new动态申请数组初始化的问题

ref : http://www.cnblogs.com/mywebname/articles/2291540.html注意括号的使用注意:C++使用new和delete在堆(自由存储区)上分配和释放...
  • xyqzki
  • xyqzki
  • 2016年03月21日 16:46
  • 3742

StringBuilder 和 常用容器初始化容量--性能--详解

StringBuilder StringBuffer 与String对象不一样都是可变容量的。 底层实现都是char[] ,以数组形式实现的。 /** * The value is use...
  • cl59452
  • cl59452
  • 2017年03月17日 14:42
  • 761

C# new和初始化

本文章仅为个人学习,如有错误,请指正。 虽然知道使用new可以创建对象,但一直不是很理解初始化和new等知识的具体。 通过8个问题和需求,了解相关知识。 了解问题和需求 1.new 的三个步骤...
  • kang_xuan
  • kang_xuan
  • 2017年08月06日 11:54
  • 440

从一个实例看java,new一个对象时的初始化顺序

例子如下: package com.zhiru; class ADemo { private static int id; static { id = 0; System.out.pr...
  • lantiancaiyun
  • lantiancaiyun
  • 2014年09月10日 09:27
  • 1716

对象创建过程,初始化顺序

Java虚拟机创建一个对象都包含以下步骤。 (1)给对象分配内存。 (2)将对象的实例变量自动初始化为其变量类型的默认值。 (3)初始化对象,给实例变量赋予正确的初始值。   对于以上第三个步...
  • u013127724
  • u013127724
  • 2015年04月08日 17:19
  • 2078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用new时的初始化问题
举报原因:
原因补充:

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