2016-06-13 86 views
0

我现在正在用VC++工作几个月。直到今天,我从来没有遇到过“堆栈溢出”错误,当我尝试传递一个结构的功能。堆栈溢出错误:将struct传递给函数vC++

这是我的代码:

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()?

+1

你的结构体大小为800K。其中三个需要2M +。默认的堆栈大小是1M - 'FILE_DATA [3]'不可能适合它。避免将大的变量放在堆栈上,而是将它们分配到堆上。我也质疑定义这样一个大结构的智慧,考虑使用类型'std :: vector '或类似的成员来代替巨大的固定大小的数组。 –

回答

0

为什么堆栈溢出错误被抛出(只要它进入ReadFiles()?

这是因为FILE_DATA [3]堆栈内存的大小默认约为1Mb,FILE_DATA [3]的大小约为2.4Mb(〜800,000×3个字节)

如果使用大尺寸的结构,请尝试使用堆内存如下:

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; 
} 
1

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

  • 使用vectorGOOD和替代File_Data->CRASH_VALUES[iLine]分配BAD
  • 使用vector.push_back
  • 使用动态分配(如果您不使用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]; 
    ...