是否有引用的地方是否需要釋放某個函數返回的對象?目前,我只是嘗試... Free()函數返回的對象的名稱中包含諸如「new」,「copy」,「create」之類的單詞,如果程序沒有崩潰,我假定該調用是正確的。如何判斷哪個libxml2函數返回需要釋放的對象?
-1
A
回答
0
這是一個非常糟糕的主意。如果您正在使用返回指向已分配對象指針的庫API ,尤其是如果分配的對象是「不透明」類型的,如果您不直接訪問它們,而只是將它們傳遞給其他函數,那麼庫幾乎當然提供了自己的函數來關閉/釋放/破壞/釋放這些對象。有多種原因,你不應該只使用free
:
由庫中創建的對象不可能是由
malloc
獲得一個分配。它可能包含指向其他分配的指針,如果你只是free
它,你將失去釋放這些分配和內存泄漏的能力。庫返回的指針可能不是
malloc
對象的開始,而是其中的某個點。在這種情況下,將它傳遞給free
會調用未定義的行爲,並且可能看起來工作正常,或者崩潰或損壞內存,以致於以後只會看到損壞的後果。庫可能會保持它已分配的對象的內部指標(標準庫
stdio
將是一個很好的例子),在這種情況下,如果你free
其背後的對象,它將以後的訪問釋放的內存並調用未定義的行爲。
使用free
最重要的規則是,你必須從未通過任何指針free
除非被malloc
獲得的指針(「彷彿被」或)。有些圖書館可能會記錄他們返回的指針,通過malloc
獲得,並且當您不再需要時,您應該將其傳遞到free
,但除非您以書面形式看到此合約,否則不要將由庫函數獲得的指針傳遞給free
。
至於libxml2
,這裏是本手冊:
它應該包含關於如何釋放被分配的libxml2對象的信息。
相關問題
- 1. 你如何判斷你是否需要釋放一個對象?
- 2. 如何釋放需要從函數返回的雙指針?
- 3. 我是否需要釋放一個返回的NSError對象?
- 4. 如何判斷在java線程中要同步哪個對象?
- 5. 如何釋放返回的對象?
- 6. allocWithZone對象需要釋放
- 7. 我需要從GetNamedSecurityInfo API中釋放哪些返回的參數?
- 8. 如何判斷對象何時發送釋放消息?
- 9. 我是否需要釋放從gtk_builder_get_object返回的對象?
- 10. 如何判斷對象是否被釋放
- 11. 返回後釋放對象?
- 12. OpenGLES釋放需要返回的變量
- 13. 如何判斷哪個文件需要在這裏?
- 14. 如何判斷在CMakeLists.txt中需要哪個最小CMake版本?
- 15. 從C#調用Windows API函數時需要明確釋放哪些對象?
- 16. 由函數返回的釋放自定義對象
- 17. 您是否釋放函數中返回的對象?
- 18. 如何判斷空對象?
- 19. 如何判斷沒有返回值的函數的結果?
- 20. 如何判斷我在xml對象中的哪個位置
- 21. 函數如何返回一個對象?
- 22. Memory/Obj-C正確的對象釋放。哪些需要發佈?
- 23. 如何判斷是否刪除函數返回的指針
- 24. MooTools:如何判斷對象是數組?
- 25. 是否需要釋放該對象?
- 26. 我是否需要釋放UITouch對象?
- 27. 我是否需要釋放此對象?
- 28. C#用戶控件 - 如何判斷控件需要數據的包含對象
- 29. 需要釋放SHGetDesktopFolder返回的IShellFolder接口?如何?
- 30. 如何返回一個需要2個參數的函數1
By ...我的意思是「...」將被替換爲相應的obj類型。例如, xmlDocPtr doc = xmlParseMemory(...); xmlDocFree(doc); 如果您查看xmlParseMemory的手動條目,則沒有說明釋放文檔。 –
我只能猜測,自從創建了對象「doc」之後,它必須被釋放,而且這似乎工作。但有些情況下,不容易判斷一個obj是否被創建或引用,並且一個... Free會在某處一路炸開。 –
如果你正在談論調用圖書館的'xmlDocFree'函數和類似的而不是'free',我認爲你做的是正確的事情,但很難用一些記錄不完善的庫來告訴它...... –