You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:15:06