new 演算子がメモリの割り当てに失敗した場合、 new ステートメントをすぐに囲む try-catch ブロックを配置した場合にのみ、例外 std::bad_alloc がキャッチされます。代わりに、数スタックフレーム下の呼び出し元に try-catch ブロックがある場合、そこでキャッチされず、異常なプログラム終了が発生します。なぜこれが起こるのですか?これは Microsoft Visual Studio 2008 上にあります。
編集:OK、これは機能していないコードです。すぐ下の関数は new を呼び出している場所で、その下の関数はその下のスタックフレームです。最後の関数は、catch 句がある場所ですが、そこでキャッチされません。
void HTTPResponseBuff::grow()
{
if (m_nMaxSize > m_nStartConstGrowSize)
m_nMaxSize += m_nConstGrowSize;
else
m_nMaxSize = 2 * m_nMaxSize;
char* pTmp = new char[m_nMaxSize];
. . .
}
void HTTPResponseBuff::write(const char* pBuf, size_t len)
{
char* pCh;
while (getRemainingCapacity(pCh) < len)
grow();
. . .
}
size_t HTTPTransport::responseCallback(void *pRespData, size_t size,
size_t nmemb, void *pRespBuff)
{
const char* pChar = (const char*)pRespData;
register int respDataLen = size * nmemb;
((HTTPResponseBuff*)pRespBuff)->write(pChar, respDataLen);
return respDataLen;
}
A few curl library stackframes here. These are C code, not C++.
ISTATUS HTTPTransport::invoke()
{
invokeCleanup();
//make the HTTP call
CURLcode retCode;
try{
retCode = curl_easy_perform(m_pCurl);
}
catch(std::bad_alloc& ba)
{
strcpy(m_pErrMsg,ba.what());
m_status = IFAILURE;
}
}
また、bad_alloc をキャッチしたときのスタックフレーム (新しいステートメントをすぐに囲む catch 句内) は次のとおりです。