gpt4 book ai didi

C 内存错误调试断言失败

转载 作者:行者123 更新时间:2023-12-03 04:47:13 26 4
gpt4 key购买 nike

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

调试断言失败!
文件:f:\dd\vctools\crt_bld\self_x86\crt\src\dbgheap.c
线路:1322
表达式:_CrtIsValidHeapPointer(pUserData)

所以我调试了我的程序,发现问题发生在第二次调用以下函数时,更具体地说是最后的 free 语句。

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 的返回类型。有人可以帮忙吗?
干杯。

最佳答案

您正在将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) 进行了两次调用。您应该调用一次并保存结果。

关于C 内存错误调试断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7788557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com