- 使用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的也要以数组方式delete
qDebug() << "数字是:" << 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; // 不会有任何副作用