3
A
回答
2
簡短的回答:第
不保證消毒劑將檢測每一個可能的泄漏。也沒有保證編譯器會警告所有泄漏。也不保證Valgrind會發現所有泄漏。
這些工具以不同的方式盡其所能,但它們都有侷限性(和錯誤)。
例如;
編譯器只能通過分析源代碼來檢測它可以檢測到的泄漏(並且它也有合理花費的時間上限)。
清潔劑只能檢測它被寫入測試的錯誤 - 然後,它只會在您實際執行的代碼中檢測到它們。因此,如果您的應用程序的特定運行只執行50%的代碼,並且泄漏位於另一半,則不會看到它。同樣,Valgrind只能檢測它被設計用於檢測的泄漏,它不能訪問源代碼,也沒有編譯器檢測的好處,它也只能看到實際運行的代碼中的泄漏。
所以沒有。不標記任何泄漏的工具不能證明沒有泄漏。這需要形式化的證明,不僅僅是代碼的正確性,還包括它所依賴的一切(比如標準庫),這對於真實世界的程序來說並不是一個解決的問題。
最好的辦法是運行一些不同的工具並修復他們發現的問題,並仔細地刻意編寫你的代碼,並且知道你在做什麼。
+1
難以檢測到的一種泄漏(也許是不可能的)是自我參照循環。 – vu1p3n0x
1
......這是否保證在運行時沒有內存泄漏?
那麼,-fsanitize
可能會要求從措辭過度期望。該功能並不真消毒從內存泄漏問題的代碼,但有助於檢測它們。
-fsanitize=leak Enable LeakSanitizer, a memory leak detector. This option only matters for linking of executables and if neither -fsanitize=address nor -fsanitize=thread is used. In that case the executable is linked against a library that overrides "malloc" and other allocator functions. See <https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer > for more details. The run-time behavior can be influenced using the LSAN_OPTIONS environment variable.
相關問題
- 1. 如何使用泄漏消毒劑找到內存泄漏的原因
- 2. os.walk是否泄漏內存?
- 3. System.Diagnostics.EventLog是否泄漏內存?
- 4. 內存泄漏沒有檢測到CRT內存泄漏檢測
- 5. 內存泄漏
- 6. 內存泄漏:
- 7. 內存泄漏
- 8. 內存泄漏
- 9. 內存泄漏
- 10. 內存泄漏
- 11. 內存泄漏
- 12. 內存泄漏
- 13. 內存泄漏
- 14. 內存泄漏
- 15. 內存泄漏:
- 16. 內存泄漏
- 17. 內存泄漏
- 18. 內存泄漏
- 19. 內存泄漏
- 20. 內存泄漏
- 21. 內存泄漏
- 22. 內存泄漏
- 23. CGImageRef |內存消耗|泄漏
- 24. python內存泄漏,泄漏幀
- 25. 泄漏填充內存泄漏iPhone
- 26. 使用UIReferenceLibraryViewController是否有內存泄漏?
- 27. 它是否有內存泄漏?
- 28. 新對象是否有內存泄漏?
- 29. sqlite3_exec是否有內存泄漏?
- 30. Async.StartChild是否有內存泄漏?
引用非常受歡迎的俄羅斯書籍「只有保險政策才能給予絕對保證」。 – SergeyA