C++动态数组插入元素时原有值被重置为0的问题咨询
代码错误原因
- 未拷贝原有数组数据:
insertAtBeginning方法中直接给arr重新分配全新的内存空间,没有将旧数组中的已有元素拷贝到新数组,原有数据直接丢失。新分配的内存值是未定义的,你遇到的0只是内存初始值的偶然表现。 - 数组大小分配逻辑错误:插入元素前原数组长度为
arr_size,新数组的长度应为arr_size + 1。但你的代码中arr = new int[arr_size++]是先使用当前的arr_size值分配数组,再对arr_size执行自增,导致分配的新数组长度比实际需要的少1。例如第一次插入时原arr_size=0,实际分配了长度为0的数组,自增后arr_size=1,后续操作直接访问越界内存。 - 循环越界访问:
arr_size自增后,新数组的合法下标范围是0 ~ arr_size-1,但你的循环for(int i=arr_size;i>0;i--)初始值直接取arr_size,访问arr[i]属于越界写操作,触发未定义行为。 - 内存泄漏:每次重新分配数组内存时,没有释放旧数组的内存空间,造成内存资源泄漏。
- 野指针风险:main函数中定义的
int *arr没有初始化,是野指针,虽然首次插入会给它赋值,但存在潜在的非法访问风险。
修复方案
修正后的insertAtBeginning方法如下:
virtual void insertAtBeginning(int*& arr,int& arr_size,int val){ // 保存旧数组指针和长度 int* old_arr = arr; int old_size = arr_size; // 更新为新的数组长度 arr_size++; // 分配足够长度的新数组 arr = new int[arr_size]; // 拷贝旧数组元素到新数组的对应位置 for(int i = 0; i < old_size; i++){ arr[i+1] = old_arr[i]; } // 头部插入新元素 arr[0] = val; // 释放旧数组的内存 delete[] old_arr; }
同时将main函数中的指针初始化改为int *arr = nullptr;即可解决问题。
内容的提问来源于stack exchange,提问作者its_shyam640
相关产品推荐
相关产品推荐

