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;
Où est le nouveau conseil d'administration de la mémoire allouée? 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