這些問題都是沒有考慮到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以上,就拋出異常的情況,沒有重現出來。希望有經驗的大牛指點一下。