【问题标题】:C pointer and memory leakC 指针和内存泄漏
【发布时间】:2013-10-31 10:51:23
【问题描述】:

我是 C 新手。我已经看到在许多示例中 malloc() 总是与 free() 配对。但是如果我做这样的事情:比如 *p = "a string" ,我可以释放指针 p 吗?它会导致内存泄漏问题吗?

编辑:感谢所有回复! 所以我的问题变成了:如果我在函数中有 *p = "a string",这是否意味着当函数结束时编译器将自动“释放”用于此函数调用的所有内存,所以我不必须手动管理任何东西来处理内存?

【问题讨论】:

  • 你可以释放它,但如果你不释放它就不会泄漏
  • 只有malloc动态分配的内存,calloc函数我们需要使用free()函数显式释放。
  • 如果您使用char *p = "a string";,那么您以后就不会释放该内存。在这种情况下,这是由编译器管理的,因为您没有使用 malloccalloc
  • @GrijeshChauhan - 只有malloc、calloc动态分配的内存fopen()之类的东西呢?
  • @ryyker 你在fp 上申请free() 吗?!!!我使用 fclose

标签: c pointers memory free memory-leaks


【解决方案1】:

对于初学者,您应该编写 const char *p = "a string";,因为它是 未定义的行为 来修改字符串文字(例如,使用像 p[0] = 'A'; 这样的语句)。删除const 会给你带来麻烦。

而且你绝不能试图删除指针内存;这也是未定义的行为

黄金法则:mallocfree总是配对。

请放心,在您的情况下,您的字符串文字占用的内存将在程序退出时由 C 运行时优雅地释放回操作系统。

【讨论】:

  • 你的最后一句话,在程序退出时说,这意味着如果我有一个包含 *p = "a string" 的函数 A(),如果函数 A 在程序退出之前被调用十亿次, 会用完所有内存吗?
  • @Hugh H,也许如果你有一个特别糟糕的编译器,那么可以。但是编译器将所有字符串文字存储在内存池中非常简单。概念上在程序执行之前。
  • @Hugh H 基本上,程序中“字符串”的每个实例都映射到内存的同一部分。这没关系,因为您不能更改字符串文字。无论你使用多少次字符串文字,它都不会使用更多的空间来存储它。
  • 这就是我坚持const char*类型的原因。
【解决方案2】:

你不需要释放这个指针,因为它指向一个字符串常量。如果您尝试释放它,它实际上可能会导致未定义的行为。

内存管理的基本规则:如果你调用malloc()获取内存,你应该在不需要的时候使用free()释放它。

【讨论】:

    【解决方案3】:

    没有。 “a string”是存储在只读静态内存中的数据,p 是指向它的指针。您只能释放指向使用 malloc 分配的内存的指针。

    【讨论】:

      【解决方案4】:

      不,你不能释放它,你也不应该。

      当您将指针指向例如一个字符串文字,它指向不是你分配的内存。您应该只释放您明确分配的内存(例如malloccallocstrdup)。

      其他函数也可能会分配您需要释放的内存,但他们应该在文档中说明这一点。

      作为一般经验法则:如果您明确分配了一些资源(如内存或文件),那么您也应该释放它。

      【讨论】:

      • 提到有其他个可能的内存泄漏来源,(例如fopen() - fclose()对等)+1
      【解决方案5】:

      当您执行*p = "a string" 时,您有一个指向字符串文字的指针p。在这种情况下,不会动态分配内存。所以,没有必要释放p,你也不应该。

      【讨论】:

        猜你喜欢
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 2014-09-25
        • 2014-08-25
        • 1970-01-01
        • 1970-01-01
        • 2016-05-14
        相关资源
        最近更新 更多