2011-11-06 75 views
-1

如下因素的功能的代碼:C++函數給出存儲器的alloc錯誤

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

這是一個令人不快的代碼構造,你在那裏使用... –

+0

我也不明白代碼的目的。你如何表達圖表?用簡單的話來解釋可能會幫助我們和你。它似乎比它需要的複雜得多。 –

+0

噢,順便說一下:如果你按照http://sscce.org/的建議,我們可能真的能夠幫助你。 –

回答

1

如果我正確理解了您的未註釋代碼,每個子數組的第一個元素描述了以下元素的數量。它也看起來像你正試圖增長一個元素的子陣列。如果是這種情況,您需要new int[x+2](增長1,長度字段1)。

但是,請找到更清晰的方式來編寫您的代碼; point[start][++point[start][0]]是怪誕的!

+1

OMG就是這樣!新的int [x + 2]是解決方案。我知道代碼不愉快,我需要糾正一些事情。謝謝 – Tohil

1

您在假設前一陣有大小爲新分配的數組一樣。

我建議你將代碼轉換爲使用std::vector而不是原始數組。這給你四個好處:

  • 你總是可以請求一個向量的size()
  • 如果有疑問,您可以用point.at(i)代替point[i],從而添加邊界檢查。
  • 除了使用for循環來複制數組,您可以簡單地使用賦值運算符複製矢量。
  • 你的代碼看起來更象C++而不是像C.
+0

感謝您的回答,但遺憾的是,我不能使用矢量庫 – Tohil

+0

@Tohil:爲什麼不呢?它是C++的一個組成部分。 –

+0

我知道,但它包含在我的編譯規範 – Tohil

-1

遺憾的是沒有一個C++編譯器的兩倍,現在檢查這個權利,但我會懷疑你的++point線沒有做什麼打算,大概應該是++(point[start][0])即沒有括號,你是增加指針,而不是數組元素。

+0

不是。由於優先規則,它們已經是等價的。 –

+0

Ahh只是雙重檢查了這讓我想起的代碼,而問題在於* p ++,它移動指針,而不是增加指向的值。 – asc99c