以下功能代码:
void add_edge(int** point, int start, int end)
{
int x;
//start->end edge
x=point[start][0];
if(x>=2)
{
int* temp=new int[x+1];
for(int i=0; i<=x; i++)
temp[i]=point[start][i];
// delete[] point[start];
point[start]=temp;
}
point[start][++point[start][0]]=end;
if(start==end) return;
//end->start edge
x=point[end][0];
if(x>=2)
{
int* temp=new int[x+1];
for(int i=0; i<=x; i++)
temp[i]=point[end][i];
// delete[] point[end];
point[end]=temp;
}
point[end][++point[end][0]]=start;
}
有一个我找不到的内存分配错误。
从valgrind我得到了这个:
==9253== Invalid write of size 4
==9253== at 0x8048643: add_edge(int**, int, int) (c1.cpp:34) (line: point[start][++point[start][0]]=end;)
==9253== by 0x8048C8B: main (c1.cpp:184) (line: add_edge(point,start,end); )
==9253== Address 0x2d6a7074 is 0 bytes after a block of size 12 alloc'd
==9253== at 0x4025FE5: operator new[](unsigned int) (vg_replace_malloc.c:299)
==9253== by 0x80485D0: add_edge(int**, int, int) (c1.cpp:28)
==9253== by 0x8048C8B: main (c1.cpp:184)
==9253==
==9253== Invalid write of size 4
==9253== at 0x80486EA: add_edge(int**, int, int) (c1.cpp:48) (line: point[end][++point[end][0]]=start; )
==9253== by 0x8048C8B: main (c1.cpp:184)
==9253== Address 0x2d6a7134 is 0 bytes after a block of size 12 alloc'd
==9253== at 0x4025FE5: operator new[](unsigned int) (vg_replace_malloc.c:299)
==9253== by 0x8048677: add_edge(int**, int, int) (c1.cpp:42)
==9253== by 0x8048C8B: main (c1.cpp:184)
==9253==
--9253-- REDIR: 0x41e07c0 (__GI_strlen) redirected to 0x4026ccc (__GI_strlen)
答案 0 :(得分:1)
您假设前一个数组的大小与新分配的数组相同。
我建议您将代码转换为使用std::vector
而不是原始数组。这给你带来了四个好处:
size()
。point[i]
替换为point.at(i)
,从而添加边界检查。for
循环来复制数组。答案 1 :(得分:1)
如果我正确理解了您的未注释代码,则每个子数组的第一个元素描述了以下元素的数量。看起来你也试图通过一个元素来增长子阵列。如果是这种情况,则需要new int[x+2]
(1表示增长,1表示长度字段)。
但是,请找一种更简洁的方法来编写代码; point[start][++point[start][0]]
怪诞!
答案 2 :(得分:-1)
不幸的是没有让C ++编译器立即对此进行双重检查,但我怀疑你的++point
行没有按预期进行,可能应该是++(point[start][0])
,即没有括号,你是递增指针,而不是数组元素。