今天看到同事这样一段代码:
MyClass* lpClass = new MyClass;
if( !lpClass )
xxxxx;
这段代码我们也许习以为常,但是是有问题的。
事实上,内存分配失败将会抛出异常std::bad_alloc
正确的写法1:
try
{
MyClass* lpClass = new MyClass;
}
catch( std::bad_alloc& e )
{
//失败时的处理
}
正确的写法2:
MyClass* lpClass = new (std::nothrow) MyClass;
if( !lpClass )
//失败时的处理
正确的写法3:
#include <new>
void my_new_handler()
{
throw std::bad_typeid(); //自定义异常,不再抛出std::bad_alloc
}
int main()
{
std::set_new_handler( my_new_handler );
try
{
char* p = new char[0x7FFFFFFE];
}
catch( std::bad_typeid& e )
{
printf( "bad alloc\n" );
}
}
if( !lpClass )
或者
if( lpClass == NULL )
来判定内存分配是否成功。
即使自定义了new_handler ,第二种写法也是有效的。