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;
}
这不仅糟糕,而且设计糟糕。你应该:
- 对
GOOD
和BAD
使用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];
...
我现在使用 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;
}
这不仅糟糕,而且设计糟糕。你应该:
- 对
GOOD
和BAD
使用 - 使用
vector.push_back
而不是File_Data->CRASH_VALUES[iLine]
赋值。 - 使用动态分配(如果不使用
vector
)。如果你必须使用动态分配,我建议使用make_unique
(C++11/14) 而不是new
,像这样:
vector
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];
...