Показать сообщение отдельно
Старый 07.04.2012, 17:25   #1
gch
Гость
Аватар для gch
Сообщений: n/a
Благодарностей:
0 всего

Поведение rf при недостатке памяти


Читаю код, и вижу:
Код:
if (dataBuf==NULL) {

//		AfxMessageBox("JpegFile :\nOut of memory",MB_ICONSTOP);

		jpeg_destroy_decompress(&cinfo);
		
		fclose(infile);

		return NULL;
	}
или так
Код:
		tmp = (BYTE*)new BYTE[widthPix*height];
		if (tmp==NULL) {
//			AfxMessageBox("Memory error");
			return FALSE;
		}
(Функции занимающиеся преобразованиями между JpegFile и RGB буфером)
Как раньше мне казалось, в случае нехватки памяти надо как можно скорее завершать работу программы, разве это не так? В случае с Java, перехват OutOfMemoryException вроде бы deprecated. А в серверной части следует использовать многопоточность для таких случаев, и память выделять заранее, что бы избежать падения сервера из-за ресурсного превышения, комбинируя подход с установкой пределов для отдельных исполнителей (используя, например, ulimit). Так, основной части сервера всегда останется память, а дочерние обработчики не смогут захватить всех ресурсов. Не могли бы вы пояснить такую особенность проектирования?

И еще примеры:

Код:
BOOL
_CreateCharIF( LPDIRECT3DDEVICE8 pi_pD3DDevice )
{
	if( g_ifCharIF != NULL ) return FALSE;
	if( pi_pD3DDevice == NULL ) return FALSE;

	// *********52880;*********47533;*********53552; *********51064;*********53552;*********54168;*********51060;*********49828; *********44061;*********52404; *********49373;*********49457;
	if( ( g_ifCharIF == NULL ) && ( g_dwCharIFRefCnt == 0 ) )
	{
		g_ifCharIF = new ChInterface;

		if( g_ifCharIF == NULL ) return FALSE;
	}

	// *********52880;*********47533;*********53552; *********51064;*********53552;*********54168;*********51060;*********49828; *********52488;*********44592;*********54868;
	g_ifCharIF->InitCharacter( pi_pD3DDevice );

	return TRUE;
}
И несколько примеров без проверок(та логика по которой корейцы определяли необходимость проверки мне также не доступна) :
Код:
	g_pMeshMgr = new CUnityMeshMgr;

	g_pMeshMgr->Create();
Код:
	g_pAnimationMgr = new CUnityAniMgr;

	g_pAnimationMgr->Create();
Код:
BOOL
_CreateItemDataMgr( void )
{
	if( g_pItemDataMgr != NULL ) return FALSE;

	g_pItemDataMgr = new CItemDataMgr;

	return TRUE;
}
P.S. исходники брал отсюда, явно не полные, загуглились быстро.