C++棧上申請過大內存導致stackoverflow

今天寫了一個函數,使用了約2M的空間,下列函數中的靜態常量max_audio_index_file_size=2000000,

void ReadAudioIndexFile()

{
std::string fileName = audioFilePath + audioIndexFileName;
FILE* pFile = fopen( fileName.c_str(), "rb" );
if( NULL == pFile )
{
SSError << "Open Audio Index File Failed, FileName:" << fileName << END;
return; 
}
char buffer[max_audio_index_file_size];
memset( buffer, 0, max_audio_index_file_size );
UINT32 readNum = fread( buffer, 1, max_audio_index_file_size,  pFile );
fclose(pFile);
std::string strcontent = std::string( buffer, readNum );
delete buffer;


KKSG::AudioList alist;
if( alist.ParseFromString(strcontent) )
{
SSError << "Parse Audio Index File Failed, FileSize:" << readNum << END;
return; 
}
for( INT32 i=0; i<alist.datalist_size(); i++ )
{
UINT32 time = alist.datalist(i).time();
UINT64 uid = alist.datalist(i).uid();
ReadOneFile( time, uid );
}

}

開始調試,每次斷點走到ReadAudioIndexFile這個函數,進程就crash,報告爲 未處理的異常:0x000000FD, stack overflow

後來發現這個是因爲 char buffer[max_audio_index_file_size] 這個地方,在棧上申請了太多的內存,導致棧溢出,後來把該處

改爲從堆上分配空間,就解決了: char* buffer = new char[max_audio_index_file_size];

重新編譯,調試,斷點走到此處,再也不會crash






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章