任何人都可以告诉我这段代码有什么问题
int* x=new int(5) ;
int i =0;
int** y = new int*[i];
for(int j = 0 ;j<5 ; j++)
{
y[i++]=x;
}
delete[] y;
当我删除y时,编译器总是触发断点 请注意,我不想删除对象“x” 感谢
答案 0 :(得分:7)
int i =0;
int** y = new int*[i];
好吧,你刚刚分配了一个指向int的指针数组,其大小足以容纳零元素。在你的循环中你是:
j
。x
的值分配给...... y
的所有其他元素...如前所述,它超出了数组的范围。我真的不知道你要在这里完成什么。多一点背景怎么样?您通过在y
的边界之外进行分配来调用未定义的行为,因此在此之后可能发生任何事情。
答案 1 :(得分:2)
初始化'y'时,由于i为0,因此长度为零。
答案 2 :(得分:2)
那一行
int* x=new int(5) ;
你可能意味着
int* x=new int[5]; // square brackets
然后在
int i = 0;
int** y = new int*[i];
你分配0个元素。在lop中你可能意味着迭代j
,但每次循环迭代在i
上进行两次递增:
for(int j = 0 ;i<5 ; i++)
{
y[i++]=x;
}
同样在该循环中,您将每个元素设置为指向相同的5个元素数组。我很确定你真的想要这个:
int const M = 5;
int const N = 5;
int** y = new int*[M];
for(int j = 0; j<M ; j++)
{
y[j] = new int[N];
}
答案 3 :(得分:1)
y是零长度,因为初始化时我= = 0 所以断点就是你在第二个循环中访问y [1]。 但这就是为什么增加两倍我?
答案 4 :(得分:-1)
试试这个:
int len = 5;
int* x=new int[len] ;
int** y = new int*[len];
int i =0;
for(int j = 0 ;j<len ; j++)
{
y[i++]=x;
}
delete[] y;
除非为其声明别名变量,否则不应在代码中使用常量。