C++ 中二级指针的正确释放方法
C++ 中二级指针的正确释放
一、什么是二级指针?
简单说,二级指针就是指向指针的指针。
即:
int** p;
它可以指向一个 int*
,而 int*
又指向一个 int
类型的变量。
常见应用场景
- 动态二维数组(例如
int** matrix
) - 指针数组(例如
char** argv
) - 需要动态管理一组指针对象
二、二级指针申请和释放的正确流程
重点理解两步:
- 先释放每一级指针分配的内存(通常是内层的一级指针)
- 最后释放二级指针本身
图示理解:
p --> [p0][p1][p2]... (指针数组,存在堆区)↓ ↓ ↓堆内存 堆内存 堆内存 (每个p[i]指向的内存块)
三、标准示例(动态二维数组申请+释放)
示例代码
#include <iostream>int main() {int rows = 3;int cols = 4;// 1. 申请二级指针int** array = new int*[rows]; // array是指针数组// 2. 给每一行分配列的空间for (int i = 0; i < rows; ++i) {array[i] = new int[cols];}// 3. 初始化并访问for (int i = 0; i < rows; ++i)for (int j = 0; j < cols; ++j)array[i][j] = i * cols + j;// 4. 打印for (int i = 0; i < rows; ++i) {for (int j = 0; j < cols; ++j)std::cout << array[i][j] << " ";std::cout << std::endl;}// 5. 释放内存:先释放每一行for (int i = 0; i < rows; ++i) {delete[] array[i]; // 释放列}// 6. 最后释放指针数组本身delete[] array;return 0;
}
四、注意事项总结(重点)
注意点 | 说明 |
---|---|
1 | 必须先释放内层的 new[] 分配的每个块 |
2 | 最后再 delete[] 外层的指针数组 |
3 | new[] 必须对应 delete[] ,不能写成 delete |
4 | 内存分配和释放要一一对应,避免内存泄漏 |
5 | 如果中间分配失败,要释放之前成功分配的部分(异常安全问题) |
6 | C风格的 malloc/free 也可以申请二维数组,但释放方法和 C++ 不一样 |
五、错误示范(不要这么做 )
int** p = new int*[10];
for (int i = 0; i < 10; ++i)p[i] = new int[20];// 错误释放!!!
delete[] p[0]; // ❌ 只释放了第一行,其他内存泄漏
delete[] p; // ❌ 外层释放没问题,但里面没释放干净
小结:二级指针内存管理口诀
"内层先释放,外层后释放;new[]就用delete[]"
完整释放流程:
delete[] p[i]; // 释放每一行
delete[] p; // 释放指针数组