案例1:我已经编写了以下c程序,当我检查内存泄漏时,我在此行str = (char*)malloc(10);
发生了内存泄漏,即使我已经写了释放该内存的语句
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
str = (char*)malloc(10);
str = "string";
printf("length : %ld\n",strlen(str));
free(str);
return 0;
}
案例2:
当我用str="string"
替换strcpy()
时,没有任何泄漏原因是什么?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
str = (char*)malloc(10);
strcpy(str,"string");
printf("length : %ld\n",strlen(str));
free(str);
return 0;
}
答案 0 :(得分:4)
str = "string";
此str
指向不同的内存位置(在许多平台上它将是只读内存)。因此它不再指向您通过malloc
分配的内存。当你致电free(str)
时,你试图释放一些你不想要的记忆。这是一种未定义的行为。它可能什么都不做,或者可能会崩溃。而malloced记忆正在泄露。
strcpy(str,"string");
此处将字符串复制到str
指向的已分配内存。你拥有这个内存,你将数据复制到它,然后你释放它。所以这里没有问题。
因此,两种情况的基本区别在于,在第一种情况下str
指向与分配的位置不同的位置。
答案 1 :(得分:3)
两者都不一样。
在这种情况下,strcpy(str, "string")
是复制&#34;字符串&#34;的正确方法。到str。 str被分配然后你释放它。所以没有记忆泄漏。
如果是str = "string"
,分配给str的内存将丢失,并且会导致内存泄漏。
答案 2 :(得分:2)
str = (char*)malloc(10);
str = "string"; <-- You just lost the pointer to the malloced memory. ie. memory leak.
free(str); <-- Here you are trying to free the `"string"` itself. Not possible.