现在的位置: 首页 > 综合 > 正文

new能够返回NULL么?

2013年03月24日 ⁄ 综合 ⁄ 共 1415字 ⁄ 字号 评论关闭

我们经常看到有很多初学者喜欢写如下代码:
    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的实现有关系!!

抱歉!评论已关闭.