освобождение выделенной памяти - PullRequest
1 голос
/ 22 ноября 2010

gcc 4.4.5 c89

У меня есть функция create_object, в которой я выделяю память для глобальной структуры.И у меня есть функция с именем destroy_object, где я проверяю, что указатель не нулевой, а затем я освобождаю.Просто я освобождаю память, которая не была выделена.Тем не менее, я проверил это, сделав 2 последовательных вызова destroy_object.Тем не менее, я получаю дамп стека при втором вызове.Тем не менее, я уверен, что он не будет свободным, так как я назначил указатель на NULL.Поэтому следует пропустить бесплатную функцию.

static struct Config_t {
    char protocol[LINE_SIZE];
    char mode[LINE_SIZE];
} *app_cfg = NULL;

int create_object()
{
    app_cfg = malloc(sizeof *app_cfg);
    memset(app_cfg, 0, sizeof *app_cfg);
}

void destroy_config()
{
    /* Check to see if the memory is ok to free */
    if(app_cfg != NULL) {
        free(app_cfg);
        app_cfg = NULL;
    }
}

Большое спасибо за любые предложения,

====================== РЕДАКТИРОВАТЬ ========== По сути, в основной функции у меня есть вызов create_object (), я выполняю некоторую обработку, а затем вызываю destory_object.

int main(void)
{
    create_object();

    /* Do some processing on the structure */

    destroy_object();

    return 0;
}

========================= Окончательное редактирование ==== статическая структура Config_t {char protocol [LINE_SIZE];символьный режим [LINE_SIZE];} app_cfg [1] {{"", ""}};

А сейчас я не использую malloc и free.

Ответы [ 2 ]

3 голосов
/ 22 ноября 2010

У меня есть только одно предложение.Не выделяйте для этого память, это пустая трата усилий.

Поскольку app_cfg - это переменная уровня файла, в любом случае вы можете иметь только одну копию за раз, так что нет смысла выделять и-распределение.

Просто создайте его как статический без указателя и используйте его:

static struct Config_t {
    char protocol[LINE_SIZE];
    char mode[LINE_SIZE];
} app_cfg;

Вы можете предоставить create и destroyкоторая memset структура к нулям, но даже это может не потребоваться:

void create_object (void) {
    memset(&app_cfg, 0, sizeof(app_cfg));
}

void destroy_config (void) {
    memset(&app_cfg, 0, sizeof(app_cfg));
}
2 голосов
/ 22 ноября 2010

использование этого кода с gcc 3.3.3 под Cygwin работает правильно для меня, когда я вызываю его дважды. Вы не сказали нам, что вы делаете за пределами этих функций, поэтому посмотрите сначала, например. возможно, вы случайно присваиваете ненулевое значение мусора для app_cfg между вызовами. Кроме того, если вы не используете компилятор с «громким именем», есть вероятность, что это ошибка компилятора (например, он может быть слишком оптимистичным во время компиляции и предполагать, что вы никогда не передадите NULL для destroy_config). Попробуйте вставить что-то вроде:

void destroy_config()
{

    /* Check to see if the memory is ok to free */
    if(app_cfg != NULL) {
        printf("not null\n" );
        free(app_cfg);
        app_cfg = NULL;
    }else{
        printf("null\n" );
        }
}

чтобы увидеть, действительно ли он "знает", когда он нулевой.

...