2011-11-06 1 views
-1

Le code de fonction que vous avez choisi:C++ fonction donne la mémoire erreur 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; 
} 

a une erreur d'allocation de mémoire que je ne trouve pas.

De valgrind je reçois ceci:

==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

C'est une construction de code désagréable que vous utilisez là ... –

+0

Je ne comprends pas non plus le but du code. Comment représentez-vous le graphique? Une explication en termes simples pourrait nous aider ainsi que vous. Cela semble beaucoup plus compliqué qu'il ne devrait l'être. –

+0

Oh, et d'ailleurs: Si vous suivez les conseils de http://sscce.org/, nous pourrions peut-être vous aider. –

Répondre

1

Si je comprends bien votre code non commenté, le premier élément de chaque sous-tableau décrit le nombre d'éléments suivants. Il semble également que vous essayez de faire croître le sous-réseau d'un élément. Si tel est le cas, vous avez besoin de new int[x+2] (1 pour la croissance, et 1 pour le champ de longueur). Cependant, veuillez trouver une manière plus simple d'écrire votre code; point[start][++point[start][0]] est grotesque!

+1

OMG c'est tout! new int [x + 2] est la solution. Je sais que le code n'est pas agréable, j'ai besoin de corriger quelques petites choses. Je vous remercie – Tohil

1

Vous présumez que le tableau précédent a la même taille que le tableau nouvellement alloué.

Je suggère que vous convertissiez votre code pour utiliser std::vector au lieu de tableaux primitifs. Cela vous donne quatre avantages:

  • Vous pouvez toujours demander le size() d'un vecteur.
  • En cas de doute, vous pouvez remplacer point[i] par point.at(i) et ainsi ajouter une vérification des limites. Au lieu d'utiliser une boucle for pour copier une matrice, vous pouvez simplement copier un vecteur à l'aide de l'opérateur d'affectation.
  • Votre code ressemble plus C++ et moins comme C.
+0

merci pour votre réponse, mais malheureusement, le point est que je ne peux pas utiliser la bibliothèque de vecteurs – Tohil

+0

@Tohil: Pourquoi pas? C'est une partie intégrante de C++. –

+0

Je sais mais il est inclus dans ma spécification de compilation – Tohil

-1

Malheureusement pas obtenu un compilateur C++ pour vérifier ce moment, mais je soupçonne votre ligne ++point ne fait pas ce qui est prévu, et devrait probablement être ++(point[start][0]) sans les parenthèses, vous incrémentez le pointeur, pas l'élément de tableau.

+0

Non. Ils sont déjà équivalents, en raison des règles de préséance. –

+0

Ahh juste vérifié le code que cela m'a rappelé, et le problème faisait * p ++, qui déplace le pointeur, n'incrémente pas la valeur pointée. – asc99c

Questions connexes