为什么char *T = "hello"不会导致内存泄漏?

3

我在C语言中声明了一个简单的字符串:

#include <stdio.h>

int main()
{
    char *t1 = "hello";
    return 0;
}

你可以看到,我的代码中没有任何 free。我使用以下命令通过 valgrind 进行了检查:

valgrind --tool=memcheck --track-origins=yes --leak-check=yes --show-reachable=yes -v --track-fds=yes ./test

它显示:

==4329== HEAP SUMMARY:
==4329==     in use at exit: 0 bytes in 0 blocks
==4329==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==4329== 
==4329== All heap blocks were freed -- no leaks are possible
==4329== 
==4329== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2)

为什么会这样呢?我的意思是,我使用了一个指针 *T,但没有在任何地方释放它。我以为这应该导致内存泄漏。为什么不会出现内存泄漏?

你必须(m)分配一些内存来泄漏一些东西。 - Charlie Burns
如果你没有调用malloc(),那么你就不需要释放任何东西。 - user2422531
只需查看valgrind输出,它会显示“堆摘要”:堆是动态分配(即malloc)的内容所在的地方。 - effeffe
2个回答

2

您没有分配内存。您正在创建一个常量字符串,它位于可执行文件的数据段中,并分配一个指针指向该内存位置。释放它(或写入该内存位置)将是一个错误(未定义行为)。


2

这不是使用malloc进行的运行时内存分配,因此不需要将其释放回去。对于这种静态分配,内存释放直接在程序范围退出时完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接