我正在编写一个在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