运行程序时出现以下错误。
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不允许我这样做。有人可以帮忙吗?
欢呼声。
答案 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)
两次电话。你应该调用一次并保存结果。