动态扩容数组实现遇垃圾值问题求助
动态扩容数组实现遇垃圾值问题求助
Hey Ahmad,我看了你的代码,马上就能发现几个导致垃圾值和内存问题的地方,咱们一步步捋清楚:
问题根源
- 内存管理逻辑混乱:你每次循环都新建一个
ptr1,但从来没把ptr指向这个新数组,旧的ptr内存也没释放,不仅造成内存泄漏,还导致后续访问越界。 - 扩容时的越界访问:当你第一次输入非0值后,
size变成2,然后用for (int j = 0; j < size; j++)复制ptr的元素,但此时ptr还是原来大小为1的数组,j=1的时候访问的是ptr的越界位置,取到的自然是垃圾值。 - 数组创建时机错误:你在每次循环开头就新建
ptr1,如果用户输入的是0,这个ptr1是空的,之前的有效数据也没被正确保留。
修正后的代码逻辑
正确的动态扩容应该遵循「新建数组→复制旧元素→添加新元素→替换旧指针→释放旧内存」的流程,我给你改好了代码:
#include <iostream> using namespace std; int main(){ int size = 0; // 初始无元素,大小设为0更合理 int* arr = nullptr; int inp; do { cin >> inp; if (inp == 0) { break; } // 新建一个比当前大1的数组 int* newArr = new int[size + 1]; // 复制旧数组的所有元素 for (int j = 0; j < size; j++) { newArr[j] = arr[j]; } // 把新输入的值放到新数组末尾 newArr[size] = inp; // 释放旧数组的内存,避免泄漏 delete[] arr; // 更新指针和数组大小 arr = newArr; size++; } while (true); // 输出所有有效元素 for (int k = 0; k < size; k++) { cout << arr[k] << endl; } // 最后别忘了释放数组内存 delete[] arr; system("pause"); return 0; }
修正关键点说明
- 初始状态设为
size=0和arr=nullptr,更符合「空数组」的定义 - 每次扩容先创建新数组,复制完旧元素再添加新值,彻底避免越界访问
- 每次替换指针前都释放旧数组内存,解决内存泄漏问题
- 最后输出完成后主动释放数组内存,养成良好的内存管理习惯
备注:内容来源于stack exchange,提问作者Ahmad Khalid
相关产品推荐
相关产品推荐

