是否有关于是否需要释放从某个函数返回的对象的引用?目前,我只是尝试... Free()函数返回的对象,如“new”,“copy”,“create”,在其名称中,如果程序没有崩溃,我认为调用是正确的。
答案 0 :(得分:0)
这是一个非常糟糕的主意。如果你正在使用一个库API来返回指向已分配对象的指针,那么尤其是如果分配的对象是“不透明”类型,你不直接访问它们但只将它们传递给其他函数,然后该库几乎肯定提供自己的功能来关闭/释放/破坏/释放这些对象。您应该使用free
:
库创建的对象不太可能是malloc
获得的单个分配。它可能包含指向其他分配的指针,如果你只是free
,它将失去释放这些分配的能力,并且内存泄漏不良。
库返回的指针可能不是malloc
获取的对象的开头,而是指向其中的某个点。在这种情况下,将其传递给free
会调用未定义的行为,并且可能会起作用,崩溃或损坏内存,以便您稍后才能看到损坏的影响。
库可能会保留已分配的对象的内部索引(标准库中的stdio
就是一个很好的例子)在这种情况下,如果你free
背后的对象它的后面,它将在以后访问释放的内存并调用未定义的行为。
使用free
的最重要规则是,您必须永远不会传递任何指向free
的指针,除非该指针是通过(或“仿制”)获得的{ {1}}。有些库可能会记录它们返回由malloc
获得的指针,并且当你不再需要它时,你应该将它传递给malloc
,但除非你以书面形式看到这个合同,否则永远不要传递指针通过库函数获得free
。
至于free
,这是手册:
它应包含有关如何释放libxml2分配的对象的信息。