C++的new和delete
1. new、delete和malloc、free的区别
malloc和free,称作C的库函数;new和delete,称作运算符。
new不仅可以做内存开辟,还可以做内存初始化操作。
malloc开辟内存失败,是通过返回值和nullptr做比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来判断的。
int *p = (int*)malloc(sizeof(int));
if (p == nullptr) return -1;
*p = 20;
free(p);
int *q = (int*)malloc(sizeof(int)*10);
free(q);
int *p = new int(20);
delete p;
int *q = new int[10];
delete[]q;
2. new的几种用法
#include <iostream>
#include <new>
int main() {
int *pl = new int(20);
int *p2 = new (std::nothrow) int; //分配失败时返回nullptr,而不是抛出异常
const int *p3 = new const int(40);
//定位new
int data = 0;
int *p4 = new (&data) int(50);
std::cout << "data:" << data << std::endl; // data:50
return 0;
}
// 单个整数初始化为0
int* p1 = new int(); // 自动初始化为0
int* p2 = new int(0); // 显式初始化为0
int* p3 = new int{0}; // C++11 列表初始化
// 数组初始化为0
int* arr1 = new int[5](); // 所有元素初始化为0
int* arr2 = new int[5]{}; // C++11 所有元素初始化为0
int* arr3 = new int[5]{0}; // C++11 第一个元素为0,其余也为0