【问题标题】:Do I have to use malloc every time I return a pointer每次返回指针时是否必须使用 malloc
【发布时间】:2017-09-18 17:01:43
【问题描述】:

我正在开发一个几乎没有未发现的内存泄漏的程序。该代码实际上已有数十年的历史,并且是由一个不知名的人编写的。我有返回char * 的函数,我想知道是否需要free 内存。
具体来说,我有一个替换字符串中的子字符串的函数,我将指针返回到新的malloced 内存。我是free 原始字符串吗?

原版:

return(findAndReplace(str, "•",rstring));

新版本:

char *result = findAndReplace(str, "•", rstring);
free(str);
return result;

问题是:我能否 100% 确定,因为我有一个从其他地方返回的指针,所以内存已被分配?释放该内存是否安全(假设它没有在其他任何地方使用)?

编辑: str 来自这里:

str = axiom_element_get_text(element, env, messageDataNode);

【问题讨论】:

  • 答案取决于findAndReplace 的实现方式以及str 是否与malloc 一起分配。指针有很多用途;分配内存的句柄只是其中之一。
  • 您只能freemalloccallocrealloc 返回的内存。检查str是否符合这个条件。
  • @xyious--如果内存是在预编译的库函数中分配的,你可能应该使用库中匹配的释放函数......
  • 不过,我真的很想知道投票是关于什么的......感觉这是一个可以帮助很多人的问题......

标签: c pointers memory-management malloc


【解决方案1】:

没有。您需要为函数的前置条件和后置条件明确定义合同。在您的“旧版本”中,合同似乎是调用者提供了一个指向任意字符串的指针str;这个字符串的存储和生命周期取决于调用者。在“新版本”中,您已对其进行了更改,因此调用者必须提供指向由malloc 获得的字符串的指针,并且在您的函数返回后该指针不再有效(对象已被释放)。

您的核心问题很可能是现有代码库中缺少任何合同文档,这意味着您必须对原作者的意图进行逆向工程。但是,在您记录当前情况、确定更改是否有意义并确保您可以安全地更改现有代码中假设原始未记录合同的每个点之前,您不应该尝试更改任何内容。

【讨论】:

  • 我只是问,因为我想学习,我只是有一个具体的例子可以参考。如何在不为指针指向的位置分配内存的情况下从函数返回指针?
  • 指针可以指向任何生命周期尚未结束的对象。一个非常常见的情况是返回一个指针,该指针指向一个较大对象的一部分。典型示例类似于strchrstrstr,但如果您想得更大,搜索树或其他数据结构以查找特定节点并返回指向该节点的指针的函数也是一个示例。当然,在很多情况下,函数的目的是“创造新事物”,在这种情况下,您为将返回指向的指针分配存储空间。
  • 在函数名为findAndReplace 的示例中,由您决定是否(如果可以)将其视为“制作新东西”(执行替换的派生字符串) 或“改变已经存在的东西”。在后一种情况下,只有当源字符串足够大以容纳替换时,您才能真正做到“就地”。
  • @xyious-- “如何在不为指针指向的位置分配内存的情况下从函数返回指针?”它可以像返回一个指向字符串文字的指针一样简单。
  • 所以因为我假设没有办法找出我们是否被允许释放内存并且因为我无法访问返回指针的函数的源代码(它是我只有定义的库)。我是否只需要忍受潜在的内存泄漏并让它保持不变?
【解决方案2】:

不,首先不是由malloc 分配的free 内存是不安全的。您可以在没有 malloc/free 的情况下使用指针,但在一个重要的程序中,您可能会在某些(但不是全部)地方使用 malloc 和 free。

如果您尝试检测程序中的内存泄漏, 之类的工具可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 2021-09-15
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多