这可能有点长,敬请谅解。 考虑以下代码(我已经省略了一些无关部分)。这段代码接收一个指向结构体(BoardP theBoard)的指针,x和y坐标以及一个值。 目标是将该值放入在结构体中找到的2D数组中。 如果坐标超出范围,我必须增加表格的大小,将旧数据复制到新数据中,并将该值放置在其位置。 好吧,这段代码第一次调用可以工作,但第二次调用会崩溃并写入:
*** glibc detected *** ./b: double free or corruption (top): 0x092ae138 ***
我找不到答案,希望你能帮忙。
这些是来自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;
}
}
}
这些是免费功能:
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**
}
这是我创建新看板的步骤:
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;
}
这是BoardP:
typedef struct Board* BoardP;
CreateNewBoard
函数中吗?如果是这样,没有看到它如何分配内存,就不可能确定你的free
调用是否正确。如果glibc报告错误,那么它们很可能是不正确的。 - CB BaileyBoardP
是什么?它是一个指针的typedef
还是一个隐式可转换为指针的类类型? - CB Bailey