当你使用free()
时,每个人都知道你必须有malloc()
个指针,因为内存是在堆中分配的,而不是由进程负责。
但是为什么在分配没有堆的指针时我不必使用free()
:
char* text0 = calloc(20, sizeof (char));
strncpy(text0, "Hello World", 20); // Remember to use `free()`!
char* text1 = "Goodbye World!"; // No need for `free()`?
Isn' t text1
还指向堆栈上指向堆上分配的内存的指针?为什么不需要free()?
答案 0 :(得分:4)
字符串常量"Goodbye World!"
在程序启动时放在内存的全局只读部分。在堆上分配 not 。同样适用于"Hello World"
。
因此,在赋值后,text1
指向此静态字符串。由于堆上不存在字符串,因此无需免费调用。
答案 1 :(得分:3)
free
必须用于分配有malloc
的所有内存。您从堆中分配内存并且必须将其返回,以便稍后再使用它。
char* text0 = calloc(20, sizeof(char)); // this memory must be freed.
在:
text0 = "Hello World";
你过分指向分配的内存的指针。内存现已丢失,无法再次回收/重复使用。
请注意char
中sizeof(char)
周围的括号,并注意我将*
放在text0
之前,因为您要将常量字符串的地址指定给类型的变量"指向字符"的指针。编译时打开警告!
你应该做的:
free(text0);
text0 = "Hello World"; // DON'T use `free()`!
再次注意我放弃了*
。编译时发出警告的更多理由。
char* text1 = "Goodbye World!"; // No need for `free()`?
不,不需要免费调用,因为你没有从堆中分配。