【发布时间】:2013-06-21 21:13:45
【问题描述】:
是否有关于是否需要释放从某个函数返回的对象的参考?目前,我只是在函数返回的对象上尝试 ...Free(),它们的名称中包含“new”、“copy”、“create”等词,如果程序没有崩溃,我认为调用是正确的。
【问题讨论】:
是否有关于是否需要释放从某个函数返回的对象的参考?目前,我只是在函数返回的对象上尝试 ...Free(),它们的名称中包含“new”、“copy”、“create”等词,如果程序没有崩溃,我认为调用是正确的。
【问题讨论】:
这是一个非常糟糕的主意。如果您正在使用返回指向已分配对象的指针的库 API,尤其是如果分配的对象属于“不透明”类型,您不直接访问它们而只将它们传递给其他函数,那么库几乎可以肯定地提供了自己的函数来关闭/释放/销毁/释放这些对象。您不应该只使用free 的原因有很多:
库创建的对象不太可能是malloc获得的单个分配。它可能包含指向其他分配的指针,如果您只是 free 它,您将失去释放这些分配的能力并出现严重的内存泄漏。
库返回的指针可能不是指向malloc-obtained 对象的开头,而是指向它内部的某个点。在这种情况下,将其传递给 free 会调用未定义的行为,并且可能看起来可以工作、崩溃或损坏内存,因此您只能在很久以后才能看到损坏的影响。
使用free 的最重要规则是,您必须绝不将任何指针传递给free,除非该指针是由(或“如同”)malloc 获得的。一些库可能会记录它们返回一个由malloc 获得的指针,并且当您不再需要它时应该将它传递给free,但除非您以书面形式看到此合同,否则切勿传递由库函数获得的指针到free。
至于libxml2,这里是手册:
它应该包含有关如何释放由 libxml2 分配的对象的信息。
【讨论】:
xmlDocFree 函数和类似函数而不是 free,我认为您做的是正确的事情,但是对于一些文档记录不佳的库来说很难说...