我正在处理一个几乎未发现内存泄漏的程序。该代码实际上是数十年历史的,由一个不知名的人撰写。我的功能可以返回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);
no。您需要明确定义的合同,以便您的功能前后条件。在您的"旧版本"中,合同似乎是呼叫者向任意字符串提供指针str
;该字符串的存储和寿命取决于呼叫者。在"新版本"中,您已经更改了它,以便呼叫者必须提供malloc
获得的字符串的指针,以便在您的功能返回后,指针不再有效(对象已释放)。p>您的核心问题很可能是缺少现有代码库中合同的任何文件,这意味着您必须反向工程师。但是,在您记录了当前情况之前,您不应该尝试更改任何一个,决定是否有意义,并确保您可以安全地更改假定原始无证件合同的现有代码中的每个点。/p>
否,首先不是由malloc
分配的free
内存不安全。您可以使用无杂色/免费的指针,但是在非平凡的程序中,您可能会使用Malloc和一定但不是全部的地方使用Malloc。
如果您试图检测程序中的内存泄漏,则Valgrind这样的工具可能会有所帮助。