释放使用malloc/Valgrind错误分配的内存

释放使用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==

我只是在学习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==    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);