在for循环中创建和存储数组 我是C++新手,内存分配有问题。p> vector<int *> V; for(int i=0;i<3;i++){ int A[3]; cin>>A[0]>>A[1]>>A[2]; V.push_back(A); } for(int i=0;i<3;i++){ cout<<V[i][0]<<V[i][1]<<V[i][2]<<endl; }

在for循环中创建和存储数组 我是C++新手,内存分配有问题。p> vector<int *> V; for(int i=0;i<3;i++){ int A[3]; cin>>A[0]>>A[1]>>A[2]; V.push_back(A); } for(int i=0;i<3;i++){ cout<<V[i][0]<<V[i][1]<<V[i][2]<<endl; },c++,C++,输出将是 3 3 3 3 3 3 3 3 3 如果我用int*A=new int()替换inta[3],那么我得到了正确的答案。我想知道为什么?当您使用inta[3]时您正在调用未定义的行为,因为您存储在向量中的数组在循环后超出范围 如果使用int*A=newint(),分配一个整数,然后使用三个,这也调用了未定义的行为 您应该使用int*A=newint[3]或其附近,以分配一个由三个int组成的数组 在早晨寒冷的光线下,int*A=newint[3]解决方案严重泄漏。向量析构函数不知道需

输出将是

3 3 3
3 3 3
3 3 3

如果我用
int*A=new int()
替换
inta[3]
,那么我得到了正确的答案。我想知道为什么?

当您使用
inta[3]时您正在调用未定义的行为,因为您存储在向量中的数组在循环后超出范围

如果使用
int*A=newint(),分配一个整数,然后使用三个,这也调用了未定义的行为

您应该使用
int*A=newint[3]
或其附近,以分配一个由三个
int
组成的数组


在早晨寒冷的光线下,
int*A=newint[3]解决方案严重泄漏。向量析构函数不知道需要释放子数组

故障诊断仍然准确;适当的补救办法需要重新思考


我需要研究什么是正确的(无泄漏)解决方案——我现在还有其他事情要做。一个合理的选择是
vector
,但我还没有编写它,所以它可以工作。

虽然它们都生成一个包含3个元素的数组,但它们的内存空间保持在不同的模式

int A[3]将生成一个本地数组,该数组将在循环后销毁。因此,向量中的数组被销毁,您将得到一个奇怪的结果


对于int*A=new int[3],在使用delete运算符之前,不会销毁数组。因此,向量中的所有数据都将保持正确。

您正在存储一个指向本地数组的引用(通过指针),并且该引用在执行for loop的结束括号后无效。是的,我想我得到了答案。我仍然对
int a[3]
int*a=new int[3]
之间的区别感到困惑。我认为它们都为指针A的3整数分配内存???@user3404498是的,
intA[3]
分配内存,但由于var
A[3]
的生命周期,当退出for循环时,内存将被释放。很好!我完全理解这个问题/
3 3 3
3 3 3
3 3 3