- 使用new/delete操作符在堆中分配/释放内存
//使用new操作符在堆中分配内存int* p1 = new int;*p1 = 2234;qDebug() << "数字是:" << *p1;//使用delete操作符在堆中释放内存delete p1;
- 在分配内存的同时初始化
//在分配内存的时初始化int* p2 = new int(100);qDebug() << "数字是:" << *p2;delete p2;
- 以数组方式new的也要以数组方式delete
//给数组分配内存int* p3 = new int[4]{ 1,2,4,6 };//以数组方式new的也要以数组方式deleteqDebug() << "数字是:" << p3[0] << p3[1] << p3[2] << p3[3];delete[]p3;
- 通过new操作符分配N维数组,返回N-1维数组指针
//通过new操作符分配N维数组,返回N-1维数组指针//二维数组 三行四列int(*p34)[4] = new int[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};for (int i = 0; i < 3; i++){for (int n = 0; n < 4; n++){qDebug() << "数字是:" << p34[i][n];}}//释放多维数组delete[] p34;
- 定位分配
- new (指针) 类型 (初值);
- 在一个已分配的内存空间中创建对象
//内存定位分配short buf[8];//在一个已分配的内存空间中创建对象int* p6 = new (buf) int(0x12345678);qDebug() << "p6数字是:" << *p6;qDebug() << "buf数字是:" << buf[0] << buf[1] ;
-内存分配失败,new操作符抛出bad_alloc异常
//内存分配失败,new操作符抛出bad_alloc异常try{int* p5 = new int[0xFFFFFFFFF];}catch (exception& e){qDebug() << "内存分配失败";}
- 不能通过delete操作符释放已释放过的内存
//在分配内存的时初始化int* p2 = new int(100);qDebug() << "数字是:" << *p2;delete p2;//不能通过delete操作符释放已释放过的内存//delete p2;
- delete野指针后果未定义,delete空指针安全
// 动态分配内存int* ptr = new int(42);// 使用指针std::cout << "The value is: " << *ptr << std::endl;// 删除指针delete ptr;//如果仍然指向已经被释放的内存,此时ptr就是一个野指针ptr = nullptr; // 将指针设置为nullptr,避免成为野指针// 尝试再次删除指针(现在是安全的,因为ptr是nullptr)delete ptr; // 不会有任何副作用