私はこのようなヌルポインタをチェックする私のチームの人たちをたくさん見てきました:gcc(4.9)でstd :: nothrowが期待どおりに動作しないのはなぜですか?
SomeClass *pSc = new SomeClass;
if (NULL == pSc)
{
// cope with error
}
私が知られている、これは動作しません、C++のnew演算子の代わりにNULLを返すのstd :: bad_alloc例外がスローされますので。私はstd :: nothrowが本当に起こることを期待できるものを作ることができることも知っています。
#include <iostream>
#include <limits>
#include <new>
using namespace std;
void myNewHandler()
{
std::cerr << "Failed to allocate memory!" << std::endl;
}
int main(int argc, char* argv[])
{
//std::new_handler oldHandler = std::set_new_handler(myNewHandler);
int *pLotsMem = new(std::nothrow) int[std::numeric_limits<long long>::max()];
if (nullptr == pLotsMem)
{
std::cerr << "Allocation failed" << std::endl;
return -1;
}
else
{
delete[] pLotsMem;
pLotsMem = nullptr;
}
//std::set_new_handler(oldHandler);
return 0;
}
はい、私は同様のstd :: set_new_handlerの使用を実証したかった:だから私はこのような例を書きました。私の驚いたことに、これでもうまくいきませんでした。新しい演算子はまだ例外をスローしました(std :: bad_array_new_length、std :: bad_allocの派生クラス)、プログラムを終了しました。
なぜこれがうまくいかないのですか? gccのnew演算子によって返されたポインタをチェックするにはどうすればよいですか?
期待通りに動作します –
はい!また、vC++コンパイラでも動作します。しかし、なぜgccでうまくいかないのか分かりません。 –
'GCC 6.1.0'では、サイズを正当な量に減らさない限りコンパイルされません。それは期待どおりに動作します。 – Galik