在我的项目中,我有一个方法,从整数(使用strcat)创建一个字符串并将其写入文件.不幸的是它确实有内存泄漏.在跟踪泄漏时,我将代码简化为以下内容.我似乎无法找到甚至修复它.这是代码:
#include#include #include int main(int argc, char* argv[] ) { char* output = "\0"; int counter = 5; while(counter > 0) { char buffer[20]; sprintf(buffer, "%u", counter); char* temp; temp = malloc((strlen(output) + strlen(buffer) + 1)); strcpy(temp, buffer); strcat(temp, output); char* oldmemory = output; output = temp; free(oldmemory); counter--; } printf("output: %s\n", output); free(output); return 0; }
Valgrind回归:
==7125== Memcheck, a memory error detector ==7125== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==7125== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info ==7125== Command: ./foo ==7125== Parent PID: 4455 ==7125== ==7125== Invalid free() / delete / delete[] ==7125== at 0x4024B3A: free (vg_replace_malloc.c:366) ==7125== by 0x8048662: main (foo.c:20) ==7125== Address 0x8048780 is not stack'd, malloc'd or (recently) free'd ==7125== ==7125== ==7125== HEAP SUMMARY: ==7125== in use at exit: 0 bytes in 0 blocks ==7125== total heap usage: 5 allocs, 6 frees, 20 bytes allocated ==7125== ==7125== All heap blocks were freed -- no leaks are possible ==7125== ==7125== For counts of detected and suppressed errors, rerun with: -v ==7125== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 15 from 8)
内存泄漏在哪里?我该如何解决?
#include#include int main(int argc, char* argv[] ) { char* output = "\0";
字符串文字是'\ 0'自动终止,您不需要添加它.
int counter = 5; while(counter > 0) { char buffer[20]; sprintf(buffer, "%u", counter); char* temp; temp = malloc((strlen(output) + strlen(buffer) + 1)); strcpy(temp, buffer); strcat(temp, output); char* oldmemory = output; output = temp; free(oldmemory);
第一次free()
调用它时,它释放输出的初始值,这是一个指向字符串文字的指针"\0"
.调用free()
返回的有效指针以外的任何内容,*alloc()
或者NULL
是未定义的行为.
counter--; } printf("output: %s\n", output); free(output); return 0; }
valgrind报道:
==7125== Invalid free() / delete / delete[] ==7125== at 0x4024B3A: free (vg_replace_malloc.c:366) ==7125== by 0x8048662: main (foo.c:20) ==7125== Address 0x8048780 is not stack'd, malloc'd or (recently) free'd
这不是内存泄漏; 这是无效的free()
.