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

动态扩容数组实现遇垃圾值问题求助

动态扩容数组实现遇垃圾值问题求助

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;
}

修正关键点说明

  1. 初始状态设为size=0和arr=nullptr,更符合「空数组」的定义
  2. 每次扩容先创建新数组,复制完旧元素再添加新值,彻底避免越界访问
  3. 每次替换指针前都释放旧数组内存,解决内存泄漏问题
  4. 最后输出完成后主动释放数组内存,养成良好的内存管理习惯

备注:内容来源于stack exchange,提问作者Ahmad Khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 13:17:34