我正在开发一个几乎没有发现内存泄漏的程序。这段代码实际上已有几十年历史,由一个不知名的人编写。我有返回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);
答案 0 :(得分:5)
没有。您需要明确定义的功能合同。前后条件。在您的"旧版本"中,合同似乎是调用者向任意字符串提供指针str
;此字符串的存储和生命周期取决于调用者。在"新版本"中,您已对其进行了更改,以便调用者必须提供指向malloc
获取的字符串的指针,以便指针不再有效(对象)函数返回后已被释放。
您的核心问题很可能是缺少现有代码库中的合同文档,这意味着您必须对原作者的意图进行反向工程。但是你不应该尝试改变任何一个,直到你记录了当前的情况,决定改变是否有意义,并确保你可以安全地改变现有代码中假设原始的每个点。无证合同。
答案 1 :(得分:1)
不,首先未由free
分配的malloc
内存不安全。您可以使用没有malloc / free的指针,但在非平凡的程序中,您可能会使用malloc并在某些地方(但不是所有地方)免费使用。
如果您尝试检测程序中的内存泄漏,valgrind之类的工具可能有所帮助。