new/delete表达式
new/delete表达式
1 | void func(){ |
malloc和new的区别
1.malloc/free是库函数,new/delete是表达式,后两者使用时不是函数的写法
2.new表示式返回值是相应类型的指针,malloc返回值是void*
3.malloc申请的空间不会进行初始化,获取的空间是由脏数据的,但new表示式申请的空间会进行初始化
4.malloc的参数是字节数,new表达式不需要传递字节数,或根据相应的类型自动获取相应的大小
new表达式申请数组空间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 int *p = new int[10]();//申请了四十个字节的空间,且都被初始化为了0
for(int i = 0; i < 10; ++i){
cout << p[i] << endl;
}
//要自己指定数组的值
int *p2 = new int[10]{1,2,3,4,5,6};
//结果是1,2,3,4,5,6,0,0,0,0
//否则后面小括号是不能写参数的
char * p2 = new char[11]();
//也可以效仿上面的写法
char * p3 = new char[10]{"hello"};//error 这样编译器就理解成了给一个char数组的第一位存放了一个const char *类型的数据报错
//存字符串按上述要这样写
char * p4 = new char[10]{'h','e','l','l','0'};
//这样过于繁琐
//在c++中使用如下方式代表c风格字符串
char *p3 = "hello";//会有warning 因为使用一个char *指向了一个常量
//标准写法
const char * pstr = "hello";
char *p4 = new char[6]();//这里的6不太好
//优化
char *p4p = new char[strlen(pstr)+1]();
strcpy(p4p,pstr);
//输出流运算符对char型指针有默认重载效果,会自动访问指针指向的内容
cout << p4 << endl;//结果为hello
//释放申请的数组空间要[] 例如:
delete [] p4p;
回收空间总结
1
2
3
4
5
6
7 malloc free
new delete
new[] delete []
//释放完空间后,就需要做一个置空的操作例如
int * p = new int();
delete p;
p = nullptr;
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自The Yue