关于C++的new是否会对内存初始化的问题
来源:互联网 发布:it资产管理软件 免费 编辑:程序博客网 时间:2024/05/22 12:08
原文地址:http://hi.baidu.com/maxy218/item/8cd098256327c1829d63d1ca
先把结论放上来:
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++的new是否会对内存初始化的问题
- 关于C++的new是否会对内存初始化的问题
- 关于C++的new是否会对内存初始化的问题
- 关于STSDB4在不commit的情况下是否会对内存数据库产生影响
- C对内存的使用
- 指针初始化对内存访问的影响
- JS中关于对内存的释放问题[待续]
- C#_对内存的操作(转)
- C语言(对内存的理解)
- 对内存的认识
- 对内存的理解
- 对内存的思考
- 对内存的优化
- 对内存泄漏的补救
- 对内存地址的认识
- 对内存管理的思考
- CPU对内存的读写
- 程序员对内存的理解
- 理解HTTP协议
- Spring整合CXF之发布WebService服务
- gradle入门
- POJ - 3984 bfs [kuangbin带你飞]专题一
- java微信扫码支付之模式二扫码支付(预支付)
- 关于C++的new是否会对内存初始化的问题
- ubuntu设置开机启动图形应用程序,替换默认图形桌面
- 9 Project configuration is not up-to-date with pom.xml
- maven找jar包配置的网站
- sql语句的性能优化
- 错误:Error:Configuration with name 'default' not found.
- 年终感想——我的VR2016
- Mybatis的一级缓存和二级缓存-2
- 如何快速取消微博关注 自动删除批量的垃圾关