la glibc detected - double gratuit ou de corruption
cela peut être un peu long donc mes excuses.
considérons le code suivant (je l'ai laissé quelques pertinence des parties de celui-ci). ce code reçoit un pointeur vers une struct (BoardP theBoard), x & y coords et une valeur.
le but est de placer une valeur dans un tableau 2D qui se trouve dans la structure.
si les coordonnées sont en dehors des limites, j'ai augmenter la taille de la table, copie anciennes données à de nouvelles données et de la place de la valeur à sa place.
eh bien, ce code fonctionne le premier appel, mais l'appel de la deuxième, il se bloque et il écrit:
*** glibc detected *** ./b: double free or corruption (top): 0x092ae138 ***
je ne pouvais pas trouver une réponse à cela et j'espère vous aidera.
Ce sont les appels de main()
BoardP p = CreateNewBoard(10,10);
PutBoardSquare(p,10,5,'X');
PutBoardSquare(p,5,10,'O');
Boolean PutBoardSquare(BoardP theBoard, int X, int Y, char val) {
if (inBounds(X,Y,theBoard->_rows,theBoard->_cols)) {
theBoard->_board[X * theBoard->_cols + Y] = val;
return TRUE;
}
else {
int newRows = (X>=theBoard->_rows) ? (2*X) : theBoard->_rows;
int newCols = (Y>=theBoard->_cols) ? (2*Y) : theBoard->_cols;
BoardP newBoard = CreateNewBoard(newCols,newRows); //this creates a new Board with the new dimensions
if (newBoard == NULL) {
//ReportError(MEM_OUT);
return FALSE;
}
else {
copyData(theBoard,newBoard);
freeBoardArray(&theBoard->_board[0]); //free old array
theBoard->_board = newBoard->_board; //old array point to new array
FreeBoard(newBoard); //free the temp copy THIS CAUSES THE PROBLEM
PutBoardSquare(theBoard,X,Y,val);//recursion, will be in bounds now
return TRUE;
}
}
}
Ce sont des fonctions Gratuites:
void FreeBoard(BoardP board) {
if (board != NULL) {
printf("FREE 1\n");
//free the board array:
if (board->_board != NULL) {
printf("FREE 2\n");
freeBoardArray(&board->_board[0]);
printf("FREE 3\n");
}
free(board);
}
}
static void freeBoardArray(char * arrP) {
free(arrP); //**PROGRAM CRASH HERE**
}
C'est comment je créer un nouveau conseil d'administration:
BoardP CreateNewBoard(int width, int high) {
BoardP board = (BoardP) malloc(sizeof(Board));
if (board != NULL) {
board->_board = allocateBoardArray(high,width);
if ( board->_board == NULL) {
FreeBoard(board);
//TODO make file ReportError(MEM_OUT);
return NULL;
}
initializeBoard(board,high,width,X_SIGN,SPACE);
return board;
}
else {
FreeBoard(board);
//TODO make file ReportError(MEM_OUT);
return NULL;
}
}
static char* allocateBoardArray(int row, int col) {
char* newBoard = (char*) malloc(row * col * sizeof(char));
if (newBoard == NULL) {
return NULL;
}
return newBoard;
}
c'est BoardP:
typedef struct Board* BoardP;
CreateNewBoard
? Si donc, sans voir comment il est alloué, il est impossible de dire si votre free
appels sont corrects. Il est probable qu'ils ne sont pas si glibc est signalé une erreur.Oh, et ce qui est
BoardP
, est-il un typedef
d'un pointeur ou d'un type de classe qui est implicitement converti en un pointeur?l'homme, j'ai fait un vrai bordel... je vais corriger ça tout de suite
OriginalL'auteur Asher Saban | 2010-08-28
Vous devez vous connecter pour publier un commentaire.
Vous avez pour libérer de la mémoire qui vous avez attribué et ne voulez plus conserver une référence trop.
à partir de votre code, je peux voir la ligne suivante.
Maintenant vous maintenir une référence à un pointeur alloué, puis libérer le même pointeur lui-même.
Exemple de code:
je comprends, mais mon premier problème a été de faire des changements dans theBoard ce sera la dernière après la sortie de la fonction. C'est la seule façon que je mananged à résoudre, cependant il est faux comme vous le dites. Comment puis-je modifier les données dans theBoard qui sera valide après la fonction se termine?
Oups, Praveen est droit. Franc-bord(newBoard) supprime newBoard->_board. Il suffit de ne gratuit(newBoard) au lieu d'appeler votre fonction de franc-bord.
elle c'est ma struct: ypedef struct Carte { int _rows; int _cols; char _board; } Conseil, si je ne suis libre(newBoard), il sera libre de la structure mais ne libère PAS le alloués char _board (le tableau)?
Qui est correct. Voir ma réponse.
OriginalL'auteur Praveen S
Essayez ceci:
Oui. Vous ne free() les choses que vous malloc().
OriginalL'auteur karunski
Cette erreur indique que vous essayez de libérer de la mémoire, qui est déjà libérée. Ce que je suis soupçonner ici est ce bloc de code
une fois que vous êtes à la libération de la partie de la structure freeBoardArray(&carte->_board[0]); et puis vous êtes en libérant l'ensemble de la structure libre(conseil d'administration); et il me semble à l'origine du problème.Pourquoi vous en passant l'adresse de la _board pointeur?J'ai écrit le code sur la même ligne de code,ce qui provoque le problème.
};
int main(){
}
ce code provoque la même question que vous avez indiqué. Maintenant, encore une fois, essayez ce code, après le retrait des "& " gratuit(&aptr->suivant);la déclaration.Cela fonctionnera très bien.
Donc, je pense que vous avez une idée de l'endroit où vous devez modifier.
OriginalL'auteur Anil Vishnoi
L'exécution de ce code sous valgrind vais vous dire exactement sur la ligne à laquelle vous un.) d'abord libéré de la mémoire et de b.) lorsque vous avez essayé de le libérer de nouveau.
Il vous indiquera également si vous essayez d'accéder à toutes les adresses qui sont à l'intérieur d'un bloc que vous avez libéré.
OriginalL'auteur Rob Bradford