C++的内存管理
1、new/delete
- new/delete是C++具备申请/释放堆内存功能的运算符,相当于C语言中的malloc和free。
- new + 类型 会自动计算类型所需要的字节数,然后从堆中分配对应字节数的内存,并返回内存的首地址(具备类型)
- delete + 指针 会自动释放堆内存
- 注意:new/delete 与 malloc/free 不能混用,因为new和delete会自动调用类、结构的构造函数、析构函数
2、数组的分配与释放
- new + 类型[n] n表示数组的长度,如果类、结构会自动调用n此构造函数
- delete [] + 指针 通过new[]分配的内存,必须通过delete[]释放
- new[] 返回值前4个字节中存放在数组的长度
3、重复释放
- delete /delete[] 不能重复释放同一块内存
- delete /delete[] 释放野指针的后果不确定,但可以释放空指针是安全的
4、内存分配失败
- 当分配的内存过大,没有能满足需求的整块内存就会抛出异常 std::bad_alloc
-
new/delete 与C语言malloc相同点和不同点
不同点
1、身份 前者运算符 后者标准库函数
2、参数 前者类型(自动计算) 后者字节数(手动计算)
3、返回值 带类型的地址 void*地址
4、调用构造 自动调用 不会调用构造/析构函数
5、出错 抛异常 返回空 NULL
相同点
1、不能重复释放
2、可以释放NULL
3、都能管理堆内存
注意:在C++中 尽量使用引用、new/delete