我正在編寫一個在Windows上移動文件的應用程序,並且我收到了一些內存泄漏。我現在無法訪問代碼,但我知道我忘記關閉用於使用FindFirstFile和FindNextFile迭代文件的文件句柄。這可能導致內存泄漏,或者是否有其他事情必須在我的代碼中出錯?我現在不能發佈任何片段,但我想知道,如果這是我造成的問題。使用FindFile和文件句柄在C++中的內存泄漏
回答
如果打開文件句柄的過多文件(取決於內核設置)並且用完了句柄,則不會關閉打開的文件句柄會導致崩潰。但是這不會導致內存泄漏,只會導致應用程序崩潰。
內存泄漏是由於沒有相應的delete
而留下new
的內存引起的。相同的malloc()
和free()
。您可以使用valgrind
來檢查您的應用程序是否存在內存泄漏,但要準備好您的程序在valgrind中運行時速度降低約50倍。
如果你有一個具體的問題,只是張貼一些代碼,你會得到更多的信息
我會使用valgrind,但我必須使用Windows的這個應用程序,我沒有valgrind工作。每當我使用新的我正在使用刪除,所以這應該不是一個問題 – fulaphex
內存泄漏資源泄漏的只是一個特例。文件句柄也是資源。所以你肯定會泄漏各種資源。
順便說一句,你如何檢查內存泄漏?
您的問題不是編寫C++代碼,而是使用C++編譯器編譯的C代碼。 WINAPI不是C++。爲了在C++中實際使用它,必須將所有資源包裝在實現RAII的類中,以便可以從C++代碼安全地使用它們,而不必擔心資源泄漏。您還應該使用智能指針(std::unique_ptr
和std::shared_ptr
)來管理您的記憶。
我剛剛檢查了程序使用了多少內存,它使用的遠遠多於2gigs,這是所有內存泄漏檢查。我正在使用一些char *來創建新的char [],但我在這些上使用了delete []。我沒有使用任何智能指針,我不知道這些。 – fulaphex
@Fulaphex你*真的*需要學習C++。到目前爲止,你正在使用''new'和'delete'來代替'malloc'和'free'。名稱不同,但您仍然強迫自己手動管理內存。大多數通用的現代C++代碼應該像Python那樣讀取,不需要任何明確的內存管理。確保你至少是最新的Windows 7,Windows XP上的內存使用指示幾乎是無意義的。 –
- 1. 位圖和句柄內存泄漏
- 2. jsonServiceClient中的內存(句柄)泄漏
- 3. 從文件句柄讀取數據在Linux上泄漏內存
- 4. DIDiskQuotaUser泄漏的文件句柄
- 5. CreateThread的句柄泄漏
- 6. 用Win32 C++檢測文件句柄泄漏
- 7. C和OpenCV內存泄漏
- 8. C中的內存泄漏?
- 9. 「泄漏」線程句柄
- 10. Crystal Reports ReportDocument泄漏句柄
- 11. 內存泄漏C
- 12. C#內存泄漏?
- 13. C#內存泄漏?
- 14. 內存泄漏-c
- 15. 內存泄漏C#
- 16. 內存泄漏C++
- 17. 內存/句柄/ Gdi泄漏實用程序
- 18. C/C++內存泄漏(使用PCRE)
- 19. 內存泄漏在c + + dll
- 20. 內存泄漏replaceAll在C
- 21. 內存泄漏在C++
- 22. FileMaker的ODBC驅動程序不釋放句柄(內存泄漏)
- 23. 調試目標c使用xCode泄漏的內存泄漏
- 24. 使用C++異常的內存泄漏
- 25. 在iOS中調試文件句柄泄漏
- 26. 內存泄漏和在Python/C API
- 27. pdf文件和內存泄漏
- 28. WCF消息序列化泄漏事件句柄和非託管內存
- 29. .NET中的事件和內存泄漏
- 30. C#WinForm的內存泄漏
*我現在無法訪問代碼*和*我現在無法發佈任何片段* - 然後等到您有權訪問並可以包含代碼後再發布。 *爲什麼我的代碼無法正常工作?*沒有代碼只是猜測,這不是*問題和猜測*或*問題和推測*網站。 –
「*我知道我忘記關閉文件句柄,用於使用FindFirstFile和FindNextFile *遍歷文件」 - 那麼你肯定有泄漏,那麼爲什麼問你是否已經知道它? –
@RemyLebeau這正是我想知道的,如果未關閉的文件句柄可能導致內存泄漏。我無法發佈代碼,因爲它位於我辦公室的計算機上,在週末我無法訪問它。它只是不停地打擾我可能是錯誤的代碼,所以我想問:) – fulaphex