new/delete表达式

1
2
3
4
5
6
7
8
9
10
11
12
void func(){
//在堆上申请int形数据的空间,并将该空间上的数据初始化为4
int *p1 = new int(4);//括号里写的初始化的值
cout << *p1 << endl;
//初始化为该类型的默认值
int *p2 = new int();

char *p3 = new char();
cout << *p3 << endl;//初始化为了空字符

int *p4 = new int;//也可以,但是不推荐,因为可能无法确保完成初始化
}

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;