С Ошибка памяти Ошибка подтверждения отладки - PullRequest
3 голосов
/ 17 октября 2011

Я получаю следующую ошибку при запуске моей программы.

Ошибка отладочного подтверждения!
Файл: f: \ dd \ vctools \ crt_bld \ self_x86 \ crt \ src \ dbgheap.c
Линия: 1322
Выражение: _CrtIsValidHeapPointer (pUserData)

Итак, я отладил свою программу и обнаружил, что проблема возникла, когда следующая функция была вызвана во второй раз, а точнее, в свободном выражении в конце.

int writeToLog(char* str, enum LOGLEVEL logLevel) {
    if(logFile && logLevel >= level) {
        FILE* log;
        char *now = (char *)malloc(sizeof(char)*1024);
        time_t timer = time(NULL);
        if(*now == NULL) {
            return -1;
        }       
        now = ctime(&timer);
        if(now[strlen(now) - 1] == '\n') {
            now[strlen(now) - 1] = '\0';
        }
        log = fopen(logFile, "a+");
        if (log == NULL)
            return -1;
        fprintf(log, "%s%s\n", now, str);
        fclose(log);
        free(now); //fails here on the second function call
    }
    return 0;
}

Теперь я бы хотел сделать now массивом постоянных символов, но Visual Studio не позволяет мне делать это из-за возвращаемого типа ctime. Кто-нибудь может помочь?
Приветствия.

1 Ответ

3 голосов
/ 17 октября 2011

Вы заменяете указатель now на другой, возвращаемый ctime. Тогда вы пытаетесь освободить это. Таким образом, вы в конечном итоге освобождаете указатель, возвращаемый ctime, а не указатель, который вы выделили сами.

Вы не должны изменять указатель, возвращаемый ctime.

Для ваших целей вам даже не нужно выделять память вообще. Вы можете просто использовать указатель, возвращенный ctime напрямую.

Так что это должно работать нормально:

int writeToLog(char* str, enum LOGLEVEL logLevel) {
    if(logFile && logLevel >= level) {
        FILE* log;
        time_t timer = time(NULL);

        const char *now = ctime(&timer);

        size_t length = strlen(now);
        if(now[length - 1] == '\n') {
            now[length - 1] = '\0';
        }
        log = fopen(logFile, "a+");
        if (log == NULL)
            return -1;
        fprintf(log, "%s%s\n", now, str);
        fclose(log);
    }
    return 0;
}

Также обратите внимание, что вы делаете два звонка на strlen(now). Вы должны вызвать его один раз и сохранить результат.

...