释放使用malloc/Valgrind错误分配的内存
我只是在学习C,不明白为什么这段代码会导致内存泄漏:释放使用malloc/Valgrind错误分配的内存,c,C,我只是在学习C,不明白为什么这段代码会导致内存泄漏: mem_ptr=(char*)malloc(24); if (mem_ptr == NULL){ exit(EXIT_FAILURE); } mem_ptr="TEST"; printf("%s\n",mem_ptr); free(mem_ptr); 当我运行它时,Valgrind告诉我: ==17900== Invalid free() / delete / delete[] / realloc() ==17900==
mem_ptr=(char*)malloc(24);
if (mem_ptr == NULL){
exit(EXIT_FAILURE);
}
mem_ptr="TEST";
printf("%s\n",mem_ptr);
free(mem_ptr);
当我运行它时,Valgrind告诉我:
==17900== Invalid free() / delete / delete[] / realloc()
==17900== at 0x4C2B75D: free (vg_replace_malloc.c:468)
==17900== by 0x40086F: main (main.c:69)
==17900== Address 0x40099f is not stack'd, malloc'd or (recently) free'd
==17900==
==17900==
==17900== HEAP SUMMARY:
==17900== in use at exit: 24 bytes in 1 blocks
==17900== total heap usage: 1 allocs, 1 frees, 24 bytes allocated
==17900==
==17900== LEAK SUMMARY:
==17900== definitely lost: 24 bytes in 1 blocks
==17900== indirectly lost: 0 bytes in 0 blocks
==17900== possibly lost: 0 bytes in 0 blocks
==17900== still reachable: 0 bytes in 0 blocks
==17900== suppressed: 0 bytes in 0 blocks
==17900== Rerun with --leak-check=full to see details of leaked memory
==17900==
==17900== For counts of detected and suppressed errors, rerun with: -v
==17900== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
您错过了一个strcpy():
这丢弃了指向分配空间的唯一指针。当您试图释放“TEST”
时,会抱怨没有分配内存(这是正确的)。你已经泄露了你分配的24个字节
更正:
mem_ptr = (char*)malloc(24);
if (mem_ptr == NULL)
exit(EXIT_FAILURE);
strcpy(mem_ptr, "TEST");
printf("%s\n", mem_ptr);
free(mem_ptr);
mem\u ptr=“TEST”
不会将字符串复制到分配的内存中,它只会覆盖指针。谢谢!这很有效。我真的不明白为什么,但我想当我进一步学习教程时,我会的。学习字符串和指针。问题是C字符串复制必须由strcpy()
或它的一个亲戚来完成。记住:mem_ptr
只是一个指针。您可以通过malloc()
为其赋值-正如您所做的那样,完全正确。你也可以给它赋值,比如一个文字字符串,它改变了指针,它指向的地址。赋值不复制周围的字符;它只会更改指针。这与您可能学习过的大多数其他语言(Python、Perl、Java、C#、…)不同。我已删除了强制转换,因此更正的代码已被真正更正。我已恢复强制转换,因为我不反对它,甚至更喜欢这种做法——尽管其他人反对这种做法。我们肯定会更加习惯指针。再次感谢!
mem_ptr = (char*)malloc(24);
if (mem_ptr == NULL)
exit(EXIT_FAILURE);
strcpy(mem_ptr, "TEST");
printf("%s\n", mem_ptr);
free(mem_ptr);