c++ - 递归函数中的堆栈溢出

标签 c++ winapi

我正在编写一个简单的应用程序,它将某个目录中的所有文件输出到控制台。为此,我在函数 PathCreator() 中动态分配内存并返回指向该内存的指针。我不知道如何在 GetAllFiles() 中正确释放这个内存段。当我使用下面的代码时,出现堆栈溢出异常。我怎样才能解决这个问题?请不要让我使用不需要动态分配内存的东西,我只是想修复我的代码。

#include "stdafx.h"
#include <windows.h>
#include <iostream>
wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName);
int is_directory(wchar_t *p)
{
    wchar_t *t = PathCreator(p,L"\\");
    WIN32_FIND_DATA file;
    HANDLE search_hendle = FindFirstFile(t, &file);
    long error = GetLastError();
    if(error == 267)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

wchar_t *PathCreator(wchar_t *dir, wchar_t *fileName)
{
    wchar_t* path = 0;
    int size = 0;
    wchar_t *d = dir;
    wchar_t *f = fileName;
    while(*d != '\0')
    {
        d++;
        size++;
    }
    while(*f != '\0')
    {
        f++;
        size++;
    }
    path = new wchar_t[(size+=3) * sizeof(wchar_t)];
    int j = 0;
    while(j < size)
    {
        path[j] = '\0';
        j++;
    }
    int i;
    i = 0;
    while(*dir != '\0')
    {
        path[i] = *dir;
        i++;
        dir++;
    }
    path[i++] = '\\';
    wchar_t *t = fileName;  
    while(*t != '\0')
    {
        path[i] = *t;
        i++;
        t++;
    }
    path[i] = '\0';
    return path;
} 

void GetAllFiles(wchar_t* dir)
{
    wchar_t *p = 0;

    int i = 0;
    WIN32_FIND_DATA file;
    wchar_t *t = PathCreator(dir, L"*");
    HANDLE search_hendle = FindFirstFile(t, &file);
    if(search_hendle)
    {

        do
        {
            p = PathCreator(dir,file.cFileName);
            if(!is_directory(p))
            {
                std::wcout << p << std::endl;
            }
            else
            {
                GetAllFiles(p);
            }
            delete [] p;
        }
        while(FindNextFile(search_hendle, &file));

    }
    delete [] t;
    FindClose(search_hendle);
}


int _tmain(int argc, _TCHAR* argv[])
{
    GetAllFiles(L"C:\\Users");
}

最佳答案

所以,你有“.”和“..”在您的目录搜索中。

第一个条目是“.”,所以:

p = PathCreator(dir, file.cFilename)

产量:

"C:\Users\."

然后下一行:

if (!is_directory(p))

总是假的,所以它一直递归到:

GetAllFiles(p)

永远......或者直到你的堆栈爆炸,以先到者为准;-)

我建议明确检查“.”和“..”并跳过这些条目(MFC 和 Qt 等也有很好的目录处理类,但我认为你想这样做)。

我的修改:

    do
    {

        // I added this - guess I can't embolden code text
        if (wcscmp(file.cFileName,L".") == 0 || wcscmp(file.cFileName,L"..")==0)
            continue;

        p = PathCreator(dir,file.cFileName);
        if(!is_directory(p))
        {
            std::wcout << p << std::endl;
        }
        else
        {
            GetAllFiles(p);
        }
        delete [] p;
    }
    while(FindNextFile(search_hendle, &file));

关于c++ - 递归函数中的堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922303/

相关文章:

file - 覆盖 Windows 中打开的文件

c++ - 需要对 "High definition time-stamps"(win32、direct3d、性能计数器)进行一些说明

c++ - 我不明白为什么我收到段错误错误

c++ - ATL App中的TAB控件背景,XP风格

c++ - 如何检测与邻居截然不同的点

c++ - 如何避免在 C++ 中使用静态构造函数?

c++ - 从另一个 cpp 更新文本框值

c++ - Windows XP(及更高版本)中的自定义IP/UDP/RTP header +常规网络问题

c++ - v8 C++ API : pass non-English strings from JavaScript to c++

c++ - 与 Arduino 的串行通信仅在重启后的第一条消息上失败