2015-08-28 37 views
-2

我正在編寫一個在Windows上移動文件的應用程序,並且我收到了一些內存泄漏。我現在無法訪問代碼,但我知道我忘記關閉用於使用FindFirstFile和FindNextFile迭代文件的文件句柄。這可能導致內存泄漏,或者是否有其他事情必須在我的代碼中出錯?我現在不能發佈任何片段,但我想知道,如果這是我造成的問題。使用FindFile和文件句柄在C++中的內存泄漏

+2

*我現在無法訪問代碼*和*我現在無法發佈任何片段* - 然後等到您有權訪問並可以包含代碼後再發布。 *爲什麼我的代碼無法正常工作?*沒有代碼只是猜測,這不是*問題和猜測*或*問題和推測*網站。 –

+0

「*我知道我忘記關閉文件句柄,用於使用FindFirstFile和FindNextFile *遍歷文件」 - 那麼你肯定有泄漏,那麼爲什麼問你是否已經知道它? –

+0

@RemyLebeau這正是我想知道的,如果未關閉的文件句柄可能導致內存泄漏。我無法發佈代碼,因爲它位於我辦公室的計算機上,在週末我無法訪問它。它只是不停地打擾我可能是錯誤的代碼,所以我想問:) – fulaphex

回答

0

如果打開文件句柄的過多文件(取決於內核設置)並且用完了句柄,則不會關閉打開的文件句柄會導致崩潰。但是這不會導致內存泄漏,只會導致應用程序崩潰。

內存泄漏是由於沒有相應的delete而留下new的內存引起的。相同的malloc()free()。您可以使用valgrind來檢查您的應用程序是否存在內存泄漏,但要準備好您的程序在valgrind中運行時速度降低約50倍。

如果你有一個具體的問題,只是張貼一些代碼,你會得到更多的信息

+0

我會使用valgrind,但我必須使用Windows的這個應用程序,我沒有valgrind工作。每當我使用新的我正在使用刪除,所以這應該不是一個問題 – fulaphex

1

內存泄漏資源泄漏的只是一個特例。文件句柄也是資源。所以你肯定會泄漏各種資源。

順便說一句,你如何檢查內存泄漏?

您的問題不是編寫C++代碼,而是使用C++編譯器編譯的C代碼。 WINAPI不是C++。爲了在C++中實際使用它,必須將所有資源包裝在實現RAII的類中,以便可以從C++代碼安全地使用它們,而不必擔心資源泄漏。您還應該使用智能指針(std::unique_ptrstd::shared_ptr)來管理您的記憶。

+0

我剛剛檢查了程序使用了多少內存,它使用的遠遠多於2gigs,這是所有內存泄漏檢查。我正在使用一些char *來創建新的char [],但我在這些上使用了delete []。我沒有使用任何智能指針,我不知道這些。 – fulaphex

+0

@Fulaphex你*真的*需要學習C++。到目前爲止,你正在使用''new'和'delete'來代替'malloc'和'free'。名稱不同,但您仍然強迫自己手動管理內存。大多數通用的現代C++代碼應該像Python那樣讀取,不需要任何明確的內存管理。確保你至少是最新的Windows 7,Windows XP上的內存使用指示幾乎是無意義的。 –