初始化字符串时内存泄漏

时间:2016-12-21 05:52:54

标签: c string memory-leaks

案例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;
}

3 个答案:

答案 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.