c ++函数给出了内存分配错误

时间:2011-11-06 11:17:59

标签: c++

以下功能代码:

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)

3 个答案:

答案 0 :(得分:1)

您假设前一个数组的大小与新分配的数组相同。

我建议您将代码转换为使用std::vector而不是原始数组。这给你带来了四个好处:

  • 您可以随时询问向量的size()
  • 如有疑问,可以将point[i]替换为point.at(i),从而添加边界检查。
  • 您可以使用赋值运算符简单地复制矢量,而不是使用for循环来复制数组。
  • 您的代码看起来更像C ++,而不像C。

答案 1 :(得分:1)

如果我正确理解了您的未注释代码,则每个子数组的第一个元素描述了以下元素的数量。看起来你也试图通过一个元素来增长子阵列。如果是这种情况,则需要new int[x+2](1表示增长,1表示长度字段)。

但是,请找一种更简洁的方法来编写代码; point[start][++point[start][0]]怪诞!

答案 2 :(得分:-1)

不幸的是没有让C ++编译器立即对此进行双重检查,但我怀疑你的++point行没有按预期进行,可能应该是++(point[start][0]),即没有括号,你是递增指针,而不是数组元素。