2013-06-21 44 views

回答

0

这是一个非常糟糕的主意。如果您正在使用返回指向已分配对象指针的库API ,尤其是如果分配的对象是“不透明”类型的,如果您不直接访问它们,而只是将它们传递给其他函数,那么库几乎当然提供了自己的函数来关闭/释放/破坏/释放这些对象。有多种原因,你不应该只使用free

  1. 由库中创建的对象不可能是由malloc获得一个分配。它可能包含指向其他分配的指针,如果你只是free它,你将失去释放这些分配和内存泄漏的能力。

  2. 库返回的指针可能不是malloc对象的开始,而是其中的某个点。在这种情况下,将它传递给free会调用未定义的行为,并且可能看起来工作正常,或者崩溃或损坏内存,以致于以后只会看到损坏的后果。

  3. 库可能会保持它已分配的对象的内部指标(标准库stdio将是一个很好的例子),在这种情况下,如果你free其背后的对象,它将以后的访问释放的内存并调用未定义的行为。

使用free最重要的规则是,你必须从未通过任何指针free除非被malloc获得的指针(“仿佛被”或)。有些图书馆可能会记录他们返回的指针,通过malloc获得,并且当您不再需要时,您应该将其传递到free,但除非您以书面形式看到此合约,否则不要将由库函数获得的指针传递给free

至于libxml2,这里是本手册:

http://xmlsoft.org/html/

它应该包含关于如何释放被分配的libxml2对象的信息。

+0

By ...我的意思是“...”将被替换为相应的obj类型。例如, xmlDocPtr doc = xmlParseMemory(...); xmlDocFree(doc); 如果您查看xmlParseMemory的手动条目,则没有说明释放文档。 –

+0

我只能猜测,自从创建了对象“doc”之后,它必须被释放,而且这似乎工作。但有些情况下,不容易判断一个obj是否被创建或引用,并且一个... Free会在某处一路炸开。 –

+1

如果你正在谈论调用图书馆的'xmlDocFree'函数和类似的而不是'free',我认为你做的是正确的事情,但很难用一些记录不完善的库来告诉它...... –

相关问题