【问题标题】:how to tell which libxml2 functions returning objects that need to be free?如何判断哪些 libxml2 函数返回需要释放的对象?
【发布时间】:2013-06-21 21:13:45
【问题描述】:

是否有关于是否需要释放从某个函数返回的对象的参考?目前,我只是在函数返回的对象上尝试 ...Free(),它们的名称中包含“new”、“copy”、“create”等词,如果程序没有崩溃,我认为调用是正确的。

【问题讨论】:

    标签: c libxml2


    【解决方案1】:

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

    1. 库创建的对象不太可能是malloc获得的单个分配。它可能包含指向其他分配的指针,如果您只是 free 它,您将失去释放这些分配的能力并出现严重的内存泄漏。

    2. 库返回的指针可能不是指向malloc-obtained 对象的开头,而是指向它内部的某个点。在这种情况下,将其传递给 free 会调用未定义的行为,并且可能看起来可以工作、崩溃或损坏内存,因此您只能在很久以后才能看到损坏的影响。

    3. 1234563稍后将访问已释放的内存并调用未定义的行为。

    使用free 的最重要规则是,您必须绝不将任何指针传递给free,除非该指针是由(或“如同”)malloc 获得的。一些库可能会记录它们返回一个由malloc 获得的指针,并且当您不再需要它时应该将它传递给free,但除非您以书面形式看到此合同,否则切勿传递由库函数获得的指针到free

    至于libxml2,这里是手册:

    http://xmlsoft.org/html/

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

    【讨论】:

    • ...Free 我的意思是“...”将被相应的 obj 类型替换。例如,xmlDocPtr doc = xmlParseMemory(...); xmlDocFree(文档);如果您查看 xmlParseMemory 的手动条目,它没有说明释放文档。
    • 我只能猜测,既然创建了对象“doc”,就必须释放它,这似乎可行。但在某些情况下,要判断一个 obj 是创建还是引用并不容易,而且 ...Free 会在途中某个地方爆炸。
    • 如果您正在谈论调用库的 xmlDocFree 函数和类似函数而不是 free,我认为您做的是正确的事情,但是对于一些文档记录不佳的库来说很难说...
    猜你喜欢
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2023-01-05
    • 2012-04-08
    相关资源
    最近更新 更多