2015-08-28 36 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上的内存使用指示几乎是无意义的。 –