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