2013-06-21 80 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',我認爲你做的是正確的事情,但很難用一些記錄不完善的庫來告訴它...... –

相關問題