C内存错误调试断言失败

时间:2011-10-17 01:17:40

标签: c visual-studio debugging memory free

运行程序时出现以下错误。

Debug Assertion失败!
文件: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成为一个常量char数组,但是由于ctime的返回类型,visual studio不允许我这样做。有人可以帮忙吗? 欢呼声。

1 个答案:

答案 0 :(得分:3)

您正在使用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)两次电话。你应该调用一次并保存结果。