Неспособность освободить память - PullRequest
3 голосов
/ 13 февраля 2010

Я не могу по-настоящему понять, почему бесплатный процесс возвращает ошибку. Я получил этот код в C:

int LuffarschackStart(void)
{
/* to avoid the program from closing */
char readEnd;
int i = 0;    

board_type *board = malloc(sizeof(square_type));
if (board == NULL)
{
    printf("Could not allocate the memory needed...");
    scanf("%c", &readEnd);         
    return 0;
}

for(i = 0; i < 9; i = i + 1)
    board->square[i].piece_type = NO_PIECE;

board_play_game(board);    

free(board);
printf("Press any key and enter to quit the program...");
scanf("%c", &readEnd);         
return 0;
}

Структура доски, которую я размещаю, выглядит следующим образом:

typedef struct
{
    /* flag to indicate if a square is free or not */  
    int free;
    /* the type of piece stored on the square if the 
       square is not free, in this case the admissible 
       values are CROSS_PIECE and CIRCLE_PIECE, 
       otherwise the value NO_PIECE is used */ 
    int piece_type; 
} square_type; 

typedef struct
{
    square_type square[N_SQUARES]; 
    int computer_type;
    int player_type;
} board_type;

Может быть проблема в том, что мне нужно сначала освободить тип square_type внутри доски? Если это так, как мне освободить это?

Ответы [ 4 ]

7 голосов
/ 13 февраля 2010

Я думаю, что ваш malloc не прав. Должно быть

board_type *board = malloc(sizeof(board_type)); /* instead of sizeof(square_type) ...*/

Кроме того, я думаю, что ваш код правильный ...

3 голосов
/ 14 февраля 2010

Другие уже указали на ошибку, но вот макрос, который поможет отловить эти ошибки:

#define NEW(type)   (type *)malloc(sizeof(type))

Вы бы тогда использовали это так:

// Correct usage
board_type *board = NEW(board_type);

Что приятно в этом, так это то, что если вы допустили ошибку, как сделали, вы должны получить предупреждение компилятора о несовпадающих указателях из-за приведения внутри макроса:

// Incorrect usage, a decent compiler will issue a warning
board_type *board = NEW(square_type);
2 голосов
/ 13 февраля 2010

Во-первых, вы размещаете неправильный размер здесь:

board_type *board = malloc(sizeof(square_type));

Это должно быть

board_type *board = malloc(sizeof(board_type));

Возможно, вы не видели этой проблемы, но я подозреваю, что вы пишете в нераспределенную память. (Потенциальная исключительная память).

Вам не нужно освобождать внутренний массив, потому что это массив фиксированного размера, и когда вы выделите тип board_type, он будет готов ко всему массиву.

Исправьте malloc, он решит бесплатный.

0 голосов
/ 14 февраля 2010

Еще один придирка, не имеющая отношения к вашей проблеме с памятью: вам, вероятно, не нужен дополнительный флаг для пометки свободных квадратов, если вы уже различаете три возможных куска CROSS / CIRCLE / NONE ...

...