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

C++动态数组运行时崩溃问题:按键扩容数次后崩溃

问题分析及修复

你的代码崩溃主要有三个核心问题:

  • 数组初始化错误:
    代码里int * a= new int(1);是分配了一个单个int变量并赋值为1,而不是长度为1的int数组。正确的数组分配应该用new int[1]。

  • 扩容时的数组分配错误:
    同样,int *a1=new int(size);也是分配单个int变量并赋值为size,不是长度为size的数组。扩容时需要创建新数组,应该写成new int[size]。

  • 内存释放不匹配:
    你用delete[] a;释放内存,但a最初指向的是用new int(1)分配的单个对象,new和delete[]不匹配会触发未定义行为,导致程序崩溃。正确的做法是,数组用new[]分配就用delete[]释放,单个对象用new分配就用delete释放。

修复后的代码

#include<iostream>

int main(int argc, char const *argv[])
{
    std::string b;
    int size=1;
    int * a= new int[1];  // 改为数组分配
    a[0] = 0;  // 初始化第一个元素
    
    while (true)
    {
        std::cin>>b;
        
        size++;
        int *a1=new int[size];  // 改为数组分配
        for (size_t i = 0; i < size-1; i++)
            a1[i]=a[i];
        delete[] a;  // 现在匹配new[],释放正确
        a=a1;

        for (size_t i = 0; i < size; i++)
        {
            a[i]=i;
            std::cout << a[i] << std::endl;
        }
    }    
}

额外补充:每次扩容后你都把数组元素重新赋值为i,其实可以保留原有元素,只初始化新添加的那个元素,这样更符合动态数组的预期行为。

内容的提问来源于stack exchange,提问作者user18014778

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:45:41