A* p=new A();
if(p==NULL) ....
写下这段代码的可能是受到了一些书上错误的影响,因为new A()从来就不可能返回NULL,如果在这个过程中用完了内存,那么他就会抛出bad_alloc异常,绝对不会返回NULL,如果你想让他返回null,应该用new(nothrow) A(),而不是new A()。不过从异常的观点来看,这实际上是一种倒退,我们应该尽量回避。Effective C++上也是这么说的!
VS2010的标准operator new的源码:
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
static const std::bad_alloc nomem;
_RAISE(nomem);
}
return (p);
}
可以发现在内存分配失败时,p值为NULL,循环所做的就是使用new-handle寻找足够内存来分配,如果足够内存没有找到,则抛出bad_alloc异常,则函数退出,函数未返回NULL值。
但是我又好奇的看了CV6.0的代码,它内存分配失败没有抛出bad_alloc异常,而是选择返回NULL值。
void * operator new( unsigned int cb )
{
void *res = _nh_malloc( cb, 1 );
return res;
}
void * __cdecl _nh_malloc_dbg (
size_t nSize,
int nhFlag,
int nBlockUse,
const char * szFileName,
int nLine
)
{
void * pvBlk;
for (;;)
{
#ifdef _MT
/* lock the heap
*/
_mlock(_HEAP_LOCK);
__try {
#endif /* _MT */
/* do the allocation
*/
pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine);
#ifdef _MT
}
__finally {
/* unlock the heap
*/
_munlock(_HEAP_LOCK);
}
#endif /* _MT */
if (pvBlk || nhFlag == 0)
return pvBlk;
/* call installed new handler */
if (!_callnewh(nSize))
return NULL;
/* new handler was successful -- try to allocate again */
}
}
所以还是和编译器operator new的实现有关系!!