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

xyi*_*ous -1 c malloc pointers memory-management

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

原始版本:

return(findAndReplace(str, "•",rstring));
Run Code Online (Sandbox Code Playgroud)

新版本:

char *result = findAndReplace(str, "•", rstring);
free(str);
return result;
Run Code Online (Sandbox Code Playgroud)

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

编辑:str来自这里:

str = axiom_element_get_text(element, env, messageDataNode);
Run Code Online (Sandbox Code Playgroud)

R..*_*R.. 5

不需要.您需要明确定义合同,以满足您的职能前后条件.在你的"旧版本"中,合同似乎是调用者提供指向str任意字符串的指针; 此字符串的存储和生命周期取决于调用者.在"新版本"中,您已经更改了它,以便调用者必须提供指向由其获取的字符串的指针malloc,以便在函数返回后指针不再有效(对象已被释放).

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

  • 指针可以指向生命周期尚未结束的任何对象.一个非常常见的情况是返回指向*较大对象的一部分的指针.规范示例类似于`strchr`或`strstr`,但如果你认为更大,那么在树或其他数据结构中搜索特定节点并返回指向该节点的指针的函数也是一个例子.当然,你确实有很多情况,函数的目的是"创造新的东西",在这种情况下,你将为你将返回指向的指针分配存储空间. (2认同)