c++碰到的幾個問題

這些問題都是沒有考慮到cpu和內存極限所引起來的。


1、內存不夠時,new會引起異常(至少我電腦上vs2008是直接崩潰,而不是返回null)。要返回NULL,如下使用:

FRAME_AUDIO* frame  = new(std:nothrow)FRAME_AUDIO; 或者

FRAME_AUDIO* frame  = new(std:no throw)FRAME_AUDIO();

後者會在new的同時用0初始化結構體。


2、sdk的vector沒有考慮上限,所以當電腦性能不夠時,sdk裏面的音視頻幀會一直堆積起來,同時會產生bad_alloc之類的警告。撐爆內存。這是很深刻的教訓。


寫了個demo,看看new異常的表現,記錄如下:

if(內存不足 -- 內存申請到了1.7G以上)
{
if(使用沒有std::nothrow的new)
{
if(主線程)
{
彈出內存不足對話框(不管debug還是release);
}
else if(子線程)
{
拋出異常
}
}

if(使用有std::nothrow的new 或者 malloc)
{
直接返回null指針
}
}


至於大型軟件中,使用沒有std::throw的new,內存用到500M以上,就拋出異常的情況,沒有重現出來。希望有經驗的大牛指點一下。

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章