新しい演算子がメモリを割り当てられない場合、新しい命令をすぐに取り囲むtry-catchブロックを置くと例外std :: bad_allocが捕捉されます。代わりに、呼び出し側でtry-catchブロックをいくつか下にスタックすると、そこに捕捉されず、異常なプログラムのtermainationが発生します。なぜこれが起こるのですか?これはMicrosoft Visual Studio 2008にあります。std :: bad_allocが呼び出しスタックフレームで捕捉されない
編集:OK、ここでは動作していないコードです。すぐ下の関数は私が新しいものを呼び出す場所であり、以下のものはその下のスタックフレームです。最後の関数はcatch節があるところですが、そこに捕まえられません。また、私は(すぐに新しいステートメントを囲むcatch節で)bad_allocをキャッチ時点でStackFrameを
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;
}
}
はここにある:
http://s289.photobucket.com/albums/ll211/spiderman2_photo_bucket/?action=view¤t=bad_alloc.jpg
ための追加のメモリを割り当てる避ける必要があるため、この方法は、トリッキーなことができ、メモリ不足エラーが取り扱い、言いましたか?それはC++のCのようです。 – reporter
C++。コールスタック内の関数に "throws bad_alloc"が定義されていないという事実と関係がありますか?途中のスタックフレームの中にはサードパーティ製のものがあるので、このdelcarationを追加することはできません。 –
この現象を示すコードサンプルを投稿できますか? –