Index: trunk/Include/system/gc.sbp
===================================================================
--- trunk/Include/system/gc.sbp	(revision 398)
+++ trunk/Include/system/gc.sbp	(revision 399)
@@ -290,10 +290,10 @@
 
 		' 実際のメモリバッファはインデックスの分だけ多めに確保する
-		Dim ptr = HeapAlloc( hHeap, dwFlags, size + SizeOf( LONG_PTR ) ) + SizeOf( LONG_PTR )
+		__malloc = HeapAlloc( hHeap, dwFlags, size + SizeOf( LONG_PTR ) )
+		throwIfAllocationFailed( __malloc, size )
+		__malloc += SizeOf( LONG_PTR )
 
 		' 管理対象のメモリオブジェクトとして追加
-		add( ptr, size, flags )
-
-		Return ptr
+		add( __malloc, size, flags )
 	End Function
 
@@ -315,5 +315,12 @@
 
 			pTempMemoryObject->size = size
-			pTempMemoryObject->ptr = HeapReAlloc( hHeap, HEAP_ZERO_MEMORY, pTempMemoryObject->ptr - SizeOf(LONG_PTR), size + SizeOf(LONG_PTR) ) + SizeOf(LONG_PTR)
+			__realloc = HeapReAlloc( hHeap, HEAP_ZERO_MEMORY, pTempMemoryObject->ptr - SizeOf(LONG_PTR), size + SizeOf(LONG_PTR) )
+			If __realloc = 0 Then
+				LeaveCriticalSection(CriticalSection)
+				throwIfAllocationFailed(0, size)
+			End If
+			__realloc += SizeOf(LONG_PTR)
+			pTempMemoryObject->ptr = __realloc
+
 
 			If minPtr > pTempMemoryObject->ptr As ULONG_PTR Then
@@ -323,8 +330,33 @@
 				maxPtr = ( pTempMemoryObject->ptr + size ) As ULONG_PTR
 			End If
-
 		LeaveCriticalSection(CriticalSection)
-		Return pTempMemoryObject->ptr
 	End Function
+
+	/*!
+	@brief	メモリ確保に失敗したか（NULLかどうか）を調べ、失敗していたら例外を投げる。
+	@param[in] p メモリへのポインタ
+	@param[in] size 確保しようとした大きさ
+	@exception OutOfMemoryException pがNULLだったとき
+	@author	Egtra
+	@date	2007/12/24
+	ただし、sizeがあまりにも小さい場合は、例外を投げず、即座に終了する。
+	*/
+	Sub throwIfAllocationFailed(p As VoidPtr, size As SIZE_T)
+		If p = 0 Then
+			If size < 256 Then
+				/*
+				　これだけのメモリも確保できない状況では、OutOfMemoryException
+				のインスタンスすら作成できないかもしれないし、例え作成できても、
+				その後、結局メモリ不足でろくなことを行えないはず。そのため、
+				ここですぐに終了することにする。
+				　なお、この値は特に根拠があって定められた値ではない。
+				*/
+				HeapDestroy(hHeap)
+				OutputDebugString("AB malloc: Out of memory.")
+				ExitProcess(-1)
+			End If
+			Throw New System.OutOfMemoryException(ActiveBasic.Strings.SPrintf("malloc: Failed to allocate %zu byte(s) memory.", New System.UInt64(size)))
+		End If
+	End Sub
 
 	/*!
