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
相关产品推荐
相关产品推荐

