Stack Overflow error : Passing struct to function vc++

Stack Overflow error : Passing struct to function vc++

我现在使用 VC++ 几个月了。直到今天我尝试将结构传递给函数时,我才遇到 'Stack Overflow' 错误。

这是我的代码:

int bReadFileData(string sFile, struct FILE_DATA *File_Data);
const int MAX_CRASH_FILE_SIZE = 100000;
struct FILE_DATA
{
    int SIZE;
    int GOOD[MAX_CRASH_FILE_SIZE];
    int BAD[MAX_CRASH_FILE_SIZE];
};

int bReadFileData(string sFile, struct FILE_DATA *File_Data)
{

File_Data->SIZE = 0;
if(PathFileExists(Convert.StringToCstring(sFile)) == 1)
{
    string sLine = "";
    int iLine = 0;
    std::ifstream File(sFile);
    while(getline(File, sLine))
    {
        if(sLine.find(":") != std::string::npos)
        {
            File_Data->CRASH_VALUES[iLine] = sLine.substr(0, sLine.find(":"));
            File_Data->CRASH_VALUES[iLine] = sLine.substr(sLine.find(":") + 1, sLine.length());
        }
        else
        {
            File_Data->CRASH_VALUES[iLine] = (sLine);
        }
        iLine++;
    }
    File_Data->SIZE = iLine;
}
return 1;
}

`

从主函数调用下面的方法。

void ReadFiles()
{
    FILE_DATA Files[3];
    bReadFileData("C:\Test1.txt", &Files[0]);
    bReadFileData("C:\Test2.txt", &Files[1]);
    bReadFileData("C:\Test3.txt", &Files[2]);
} 

这段代码有什么问题吗?为什么会抛出堆栈溢出错误(一进入ReadFiles()?

Why stack overflow error is thrown(as soon as it enter ReadFiles()?

那是因为FILE_DATA[3] 为堆栈内存分配了太多字节。默认情况下,堆栈内存的大小约为 1Mb,而 FILE_DATA[3] 的大小约为 2.4Mb(~ 800,000 x 3 字节)。

如果使用较大的struct,尝试使用堆内存如下:

void ReadFiles()
{
  FILE_DATA* Files = new FILE_DATA[3];
  bReadFileData("C:\Test1.txt", &Files[0]);
  bReadFileData("C:\Test2.txt", &Files[1]);
  bReadFileData("C:\Test3.txt", &Files[2]);
  delete [] Files;
  Files = nullptr;
}

这不仅糟糕,而且设计糟糕。你应该:

  • GOODBAD
  • 使用vector
  • 使用 vector.push_back 而不是 File_Data->CRASH_VALUES[iLine] 赋值。
  • 使用动态分配(如果不使用vector)。如果你必须使用动态分配,我建议使用 make_unique (C++11/14) 而不是 new,像这样:

void ReadFiles()
    {
      auto Files = std::make_unique<FILE_DATA[]>(2);
      bReadFileData("C:\Test1.txt", &Files[0]);
      bReadFileData("C:\Test2.txt", &Files[1]);
      bReadFileData("C:\Test3.txt", &Files[2]);
      // delete [] Files; - DONT NEED
      // Files = nullptr;
    }

如果你可以简单地使用vector,你可以有这个:

void ReadFiles()
{
  FILE_DATA Files[3];
  ...