【问题标题】:Memory leak when initialise string初始化字符串时内存泄漏
【发布时间】:2016-12-21 05:52:54
【问题描述】:

案例 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:

当我用strcpy() 替换str="string" 时没有任何泄漏,为什么会这样?

#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;
}

【问题讨论】:

  • 案例 1 表现出未定义的行为:您不会在从 malloc() 获得的同一指针上调用 free()。而在情况 2 中,您可以这样做。
  • 1) str = "string"; 它被一个指向字符串文字的指针覆盖。
  • 案例1。 str = "string" - 错误,因为它没有复制字符串操作;必须是strcpy(str, "string"),如 case2
  • @nikniknik2016 std::string?它是 C 而不是 C++。

标签: c string memory-leaks


【解决方案1】:

str = "string";

str 之后指向不同的内存位置(在许多平台上它将是只读内存)。因此它不再指向您通过malloc 分配的内存。当您调用free(str) 时,您正在尝试释放一些您不应该释放的内存。这是未定义的行为。它可能什么也不做,也可能崩溃。并且分配的内存正在泄漏。

strcpy(str,"string");

这里的字符串被复制到str指向的已经分配的内存中。您拥有此内存,将数据复制到其中,然后释放它。所以这里没有问题。

所以这两种情况的基本区别在于,在第一种情况下,str 指向的位置与分配的位置不同。

【讨论】:

    【解决方案2】:

    两者都不相同。

    在这种情况下,strcpy(str, "string") 是将“字符串”复制到 str 的正确方法。 str 被分配然后你释放它。所以没有内存泄漏。

    如果是str = "string",分配给str的内存会丢失,会导致内存泄漏。

    【讨论】:

      【解决方案3】:
       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.
      

      【讨论】:

      • 是的,我试图释放该内存,但出现 munmap_chunk() 错误
      • 是的,我试图释放该内存,但我得到了 munmap_chunk() 错误,我得到了它发生的原因,所以只有那些指针可以由 malloc 及其友函数返回的 free 函数释放是 calloc,realloc 谢谢你的帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 1970-01-01
      • 2021-01-26
      • 1970-01-01
      • 2011-08-29
      • 2013-04-03
      • 2020-05-10
      相关资源
      最近更新 更多