C++ 调用静态c++;类方法

C++ 调用静态c++;类方法,c++,stack,overflow,segmentation-fault,C++,Stack,Overflow,Segmentation Fault,我已经研究这个问题好几个小时了,尝试了各种各样的方法,但结果都是一样的——在调用静态类方法时,会出现一个SIGSEGV(来自gdb;根据VC debug,这是堆栈溢出…) 罪犯代码: void LEHelper::copySinglePath (std::string from_path, std::string to_path) { // first check if this path is a file or folder if (!folderExists(from_pa

我已经研究这个问题好几个小时了,尝试了各种各样的方法,但结果都是一样的——在调用静态类方法时,会出现一个SIGSEGV(来自gdb;根据VC debug,这是堆栈溢出…)

罪犯代码:

void LEHelper::copySinglePath (std::string from_path, std::string to_path)
{
    // first check if this path is a file or folder
    if (!folderExists(from_path)) // is a file
    {
        FILE *fp = fopen(from_path.c_str(), "rb");
        FILE *tp = fopen(to_path.c_str(), "wb");

        if (fp && tp)
        {
            // read 1MB chunks from the file and copy to the new destination until finished
            LEuchar bytes[1048576];

            while (!feof(fp))
            {
                size_t read_num = fread(bytes, sizeof(LEuchar), 1048576, fp);
                fwrite(bytes, sizeof(LEuchar), read_num, tp);
            }
        }

        if (fp)
            fclose(fp);
        if (tp)
            fclose(tp);
    }
    else // is a folder
    {
        // make a new directory at the "to" path to copy files into
    #if defined(LE_OS_OSX)
        mkdir(to_path.c_str(), S_IRWXO | S_IRWXG | S_IRWXU);
    #elif defined(LE_OS_WIN)
        mkdir(to_path.c_str());
    #endif

        // need to get all contents and recursively perform this method with correct pathing
        LEArray<std::string> contents = getContentsOfDirectoryUsingFilter(from_path, LEH_DIR_BOTH);
        std::string *current;

        contents.initEnumerator();
        while ((current = contents.nextObject()))
        {
            // first build the current file or folder path (and new path)
            std::string current_path = from_path;
            std::string new_path = to_path;

            if (current->length() > 0)
            {
                current_path += LE_PATH_SEPARATOR + *current;
                new_path += LE_PATH_SEPARATOR + *current;
            }

            // then copy as necessary --- this is where things go bad ---
            copySinglePath(current_path, new_path);
        }
    }
}
在我正在测试的程序中,一旦成功到达递归点且所有值都正确(我一直在用
printf
检查字符串值),它就会被调用,但是在它内部调用
copySinglePath()
会失败。由于调用堆栈太小,我很难相信这实际上是由于太多递归导致的堆栈溢出。。。但我的理解可能是错误的

在寻找答案的过程中,我了解到大多数分段错误都是由指针问题引起的,因此我尝试将
copySingelPath()
的参数更改为指针,使用
new
在堆上分配传入的字符串(因此我可以控制分配等),但这没有任何区别

同样奇怪的是,这段完全相同的代码在OSX上完美运行。因此,我认为我的mingw设置可能有问题,所以我用最新的mingw-get重新安装了它,但仍然没有什么不同。我甚至认为我的VisualStudio安装文件可能会被使用(包括),所以临时更改了它们的文件夹以确保它仍然被编译,等等。所以不应该是这样的

我现在完全不知道为什么会这样。如果有人想知道我做错了什么,请


多亏了“一切提前”

您可能需要降低块的大小,或者将它们分配到堆上。调用堆栈非常小,但堆栈包含局部变量。默认情况下,Windows堆栈的内存只有1MB,而Unix堆栈的内存只有8MB。从该堆栈中分配1MB阵列是即时溢出。您需要更改链接器设置以允许更大的堆栈大小。

您可能需要降低块的大小,或者将它们分配到堆上。调用堆栈非常小,但堆栈包含局部变量。默认情况下,Windows堆栈的内存只有1MB,而Unix堆栈的内存只有8MB。从该堆栈中分配1MB阵列是即时溢出。您需要更改链接器设置以允许更大的堆栈大小。

此变量:

LEuchar bytes[1048576];
位于堆栈上并且非常大,这导致堆栈溢出。使用全局变量或动态分配的变量,问题就会消失。

此变量:

LEuchar bytes[1048576];
位于堆栈上并且非常大,这导致堆栈溢出。使用全局变量或动态分配的变量,问题就会消失。

Rob规则47:如果可以使用向量,则永远不要使用数组:

    // read 1MB chunks from the file and copy to the new destination until finished
    std::vector<LEuchar> bytes(1048576);

    while (!feof(fp))
    {
        size_t read_num = fread(&bytes[0], sizeof(LEuchar), bytes.size(), fp);
        fwrite(&bytes[0], sizeof(LEuchar), read_num, tp);
    }
//从文件中读取1MB块并复制到新目标,直到完成
std::向量字节(1048576);
而(!feof(fp))
{
size\u t read\u num=fread(&bytes[0],sizeof(LEuchar),bytes.size(),fp);
fwrite(&bytes[0],sizeof(LEuchar),read_num,tp);
}
正如其他人所指出的,问题是100万的LEuchar分配了太多的堆栈。使用向量会将分配转移到空闲存储。

Rob的规则47:如果可以使用向量,则永远不要使用数组:

    // read 1MB chunks from the file and copy to the new destination until finished
    std::vector<LEuchar> bytes(1048576);

    while (!feof(fp))
    {
        size_t read_num = fread(&bytes[0], sizeof(LEuchar), bytes.size(), fp);
        fwrite(&bytes[0], sizeof(LEuchar), read_num, tp);
    }
//从文件中读取1MB块并复制到新目标,直到完成
std::向量字节(1048576);
而(!feof(fp))
{
size\u t read\u num=fread(&bytes[0],sizeof(LEuchar),bytes.size(),fp);
fwrite(&bytes[0],sizeof(LEuchar),read_num,tp);
}

正如其他人所指出的,问题是100万的LEuchar分配了太多的堆栈。使用向量将分配转移到空闲存储。

您需要使用调试器并找到出错的行。例如,LEArray中可能有十几个错误,我们永远也找不到。只是一个提示:由于Windows不使用UTF8进行1字节编码,您的代码无法处理名称包含1字节编码中无法表示的特殊字符的文件/目录。您需要使用调试器并查找出错的行。例如,LEArray中可能有十几个错误,我们永远也找不到。只是一个提示:由于Windows不使用UTF8进行1字节编码,因此您的代码无法处理名称中包含1字节编码中无法表示的特殊字符的文件/目录。感谢您的详细解释!这正是问题所在(selalerer也指出了这一点)——我不知道这些大小默认值。同时,这也促使我更好地理解堆栈的工作原理。谢谢谢谢你的解释!这正是问题所在(selalerer也指出了这一点)——我不知道这些大小默认值。同时,这也促使我更好地理解堆栈的工作原理。谢谢很好的定位,感谢您提供可能的解决方案。如果我能投赞成票,我会:)很好的发现和感谢可能的解决方案。如果我能投赞成票,我会:)