new,malloc,free,delete
malloc,free;new,delete
**malloc和free是c的库函数
new和delete是运算符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
31
32
33
34
35
36
37
38
39
40
41int main()
{
int *p=(int*)malloc(sizeof(int)); //开辟一个整型大小的内存
//malloc的返回值为void*,(int*)为强制转换,按字节开辟
if(p==nullptr) //内存开辟失败,p为空指针
{
return -1;
}
//malloc只管开辟,还需要初始化
*p=20;
free(p); //malloc和free是c的库函数
try
{
int *pl=new int(20);
}
catch(const bad_alloc &e)
{
}
delete p1;
// new=malloc内存开辟+内存初始化
//malloc开辟失败,是通过返回值与nullptr比较
//new开辟失败,通过抛出bad_alloc类型的异常来判断
int *q=(int*)malloc(sizeof(int)*20); //无初始化
int *ql=new int[20](30); //有初始化
delete []ql; //删除数组内存,ql前面要[]
return 0;
}
总结:
- malloc 按字节开辟内存,返回void*,需要强制类型转换,而new指定类型转换,返回异常
- free只需传入内存起始位置,delete释放数组时+[]
- c++时尽量用new delete
**new有多少种?1
2
3
4
5
6
7
8
9
10
11int main()
{
int *p1=new int(20)
int *p2=new(nothrow)int; //这种不抛出异常,也是和nullptr比较
const int *p3=new const int(40);
//定位new
int data=0;
int *p4=new (%data) int(50); //在指定地址上,开辟1B,赋值为50
}
C++的引用
引用和指针的区别?
- 左值引用和右值引用
- 引用实例
**引用时一种更安全的指针
1, 引用必须初始化,指针可以不初始化1
2
3
4
5
6
7
8
9
10
11
12
13
14
15int main()
{
int a=10;
int *p=&a;
int &b=a; //引用一定要初始化,a一定要可以取地址,引用是先对右边取地址
//即int &b=20 ;错误 20 不可以取地址
//引用只有一级引用,指针可以多级引用
*p=20;
cout<<a<<" "<<*p<<" "<<b<<endl;
// 20 20 20 ;*p b是同一个地址
return 0;
}
引用的意义
1 | void swap(int a,int b) |
1 | void swap(int* a,int* b) //参数为指针 |
定义一个引用和一个指针,两者汇编指令一样;
通过引用修改值与通过指针修改,汇编也一样
1 | int main() |
左值引用与右值引用
1 | int main() |
右值引用必须先生成临时量,且可修改;不能用来引用左值(左值已有内存)