我正在使用VC ++几个月了。我从未遇到过#Stack; 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()?
答案 0 :(得分:1)
这不仅是坏事,而是糟糕的设计。你应该:
vector
用于GOOD
和BAD
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];
...
答案 1 :(得分:0)
为什么抛出堆栈溢出错误(一旦输入ReadFiles()?
那是因为FILE_DATA [3]为堆栈内存分配了太多字节。堆栈内存的大小默认大约为1Mb,而FILE_DATA [3]的大小大约为2.4Mb(~800,000 x 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;
}