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

时间:2017-09-18 17:01:44

标签: c pointers memory-management malloc

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

原始版本:

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

新版本:

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

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

编辑: str来自这里:

str = axiom_element_get_text(element, env, messageDataNode);

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

不,首先未由free分配的malloc内存不安全。您可以使用没有malloc / free的指针,但在非平凡的程序中,您可能会使用malloc并在某些地方(但不是所有地方)免费使用。

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