C++不使用vector时如何调整动态指针数组的大小
C++ 动态数组扩容实现说明
先纠正原有写法的错误
你之前对int array[5];的扩容写法本身不成立:int array[5]是栈分配的静态数组,数组名是不可修改的右值,直接执行array = temp;会直接编译报错。如果要实现动态扩容,初始定义就要改为堆分配的指针形式:
int* array = new int[5];
这样后续才能通过修改指针指向的堆地址完成扩容。
指针数组的扩容实现
同样的,你写的int *array[5];也是栈上的静态数组,数组元素为int类型指针,数组名本身不可修改,无法直接赋值新的堆地址。要实现动态扩容,初始定义需要改为二级指针形式:
// 初始大小为5的指针数组 int** array = new int*[5]; // 可选:初始化每个元素 for(int i=0; i<5; i++) { array[i] = new int(0); }
你提到的int** temp = new int* [n];写法是合法的,完整的扩容流程如下:
- 申请新的目标大小的指针数组内存
int oldSize = 5; // 用变量记录原数组大小,需要自行维护 int n = 10; // 目标新大小 int** temp = new int*[n];
- 拷贝原有有效元素到新数组,处理缩容/扩容的边界逻辑
int copyCnt = min(oldSize, n); // 拷贝有效元素 for(int i=0; i<copyCnt; i++) { temp[i] = array[i]; } // 如果是缩容,先释放被裁剪掉的元素对应的内存,避免泄漏 for(int i = copyCnt; i < oldSize; i++) { delete array[i]; } // 如果是扩容,可选初始化新增的指针元素 for(int i = copyCnt; i < n; i++) { temp[i] = nullptr; // 也可直接分配int内存:temp[i] = new int(默认值); }
- 释放原数组的内存(仅释放数组本身,已转移的元素不需要重复释放)
delete[] array;
- 更新指针指向与数组大小记录
array = temp; oldSize = n;
内存释放注意事项
整个使用过程需要自行维护数组大小变量避免越界访问。程序退出前需要按顺序释放所有堆内存,避免泄漏:
// 先释放每个元素对应的int内存 for(int i=0; i<oldSize; i++) { delete array[i]; } // 再释放指针数组本身 delete[] array;
内容的提问来源于stack exchange,提问作者Hokage97
相关产品推荐
相关产品推荐

