每次返回指针时都必须使用malloc吗

每次返回指针时都必须使用malloc吗,c,pointers,memory-management,malloc,valgrind,C,Pointers,Memory Management,Malloc,Valgrind,我正在开发一个几乎没有未发现内存泄漏的程序。这段代码已经有几十年的历史了,是由一个不知名的人写的。我有返回char*的函数,我想知道是否需要释放内存。 具体来说,我有一个函数来替换字符串中的子字符串,我返回指向新malloced内存的指针。我是否释放原始字符串 原文: return(findAndReplace(str, "•",rstring)); char *result = findAndReplace(str, "•", rstring); free

我正在开发一个几乎没有未发现内存泄漏的程序。这段代码已经有几十年的历史了,是由一个不知名的人写的。我有返回
char*
的函数,我想知道是否需要
释放
内存。
具体来说,我有一个函数来替换字符串中的子字符串,我返回指向新
malloc
ed内存的指针。我是否释放原始字符串

原文:

return(findAndReplace(str, "•",rstring));
char *result = findAndReplace(str, "•", rstring);
free(str);
return result;
新版本:

return(findAndReplace(str, "•",rstring));
char *result = findAndReplace(str, "•", rstring);
free(str);
return result;
问题是:既然我从其他地方返回了一个指针,我能100%确定内存已经分配了吗?释放内存安全吗(假设它不在其他任何地方使用)

编辑: str来自这里:

str = axiom_element_get_text(element, env, messageDataNode);

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


如果您试图检测程序中的内存泄漏,像这样的工具可能会有所帮助

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


您的核心问题很可能是现有代码库中缺少任何契约文档,这意味着您必须对原始作者的意图进行反向工程。但是你不应该试图改变这些,直到你记录了当前的情况,决定了改变是否有意义,并确保您可以安全地更改假定原始未记录合同的现有代码中的每一点。

答案取决于
findAndReplace
的实现方式,以及
str
是否分配了
malloc
。指针有很多用途;作为分配内存的句柄只是其中之一。您只能
释放
malloc
calloc
realloc
返回的内存。检查
str
是否符合此条件。@xyious--如果内存是在预编译库函数中分配的,那么您可能应该使用库中的匹配释放函数……不过,我很想知道DonVote是关于什么的。。。。我觉得这是一个可以帮助很多人的问题……我问这个问题只是因为我想学习,我只是有一个具体的例子。如果不为指针指向的位置分配内存,如何从函数返回指针?指针可以指向其生命周期尚未结束的任何对象。一种非常常见的情况是返回指向较大对象的一部分的指针。标准示例类似于
strchr
strstr
,但如果您认为更大,则搜索树或其他数据结构以查找特定节点并返回指向该节点的指针的函数也是一个示例。当然,在很多情况下,函数的目的是“创建新的内容”,在这种情况下,您会为返回指向的指针分配存储空间。在您的示例中,函数名为
findAndReplace
,由您决定是否(以及是否可以)将其视为“创建新内容”(执行替换的派生字符串)或“更改已存在的内容”。在后一种情况下,如果源字符串足够大,可以容纳替换内容,则只能“就地”执行该操作。@xyious--“在不为指针指向的位置分配内存的情况下,如何从函数返回指针?”它可以像返回一个指向字符串文字的指针一样简单。因此,由于我假设无法确定我们是否被允许释放内存,并且由于我无法访问返回指针的函数的源代码(它是库的一部分,我只有定义).我是否必须忍受一个潜在的内存泄漏,并将其留在那里?