std :: nothrow几乎没用?

时间:2014-06-02 10:50:31

标签: c++

  

Nothrow常量:此常量值用作参数   operator new和operator new []表示这些函数应该   不要在失败时抛出异常,而是返回空指针。

但是在这个简单的例子中,new抛出异常而不是返回NULL:

struct SomeStruct
{
    SomeStruct() 
    {
        std::bad_alloc exception;
        throw exception;
    }
};

    int _tmain(int argc, _TCHAR* argv[])
    {
            SomeStruct* somestruct;
            somestruct = new (std::nothrow) SomeStruct; 
            return 0;
    }

请问有什么解释吗?它只是表明,尽管(std::nothrow)参数new,我们仍然需要将代码放在try...catch块中。

2 个答案:

答案 0 :(得分:3)

std::nothrow表示std::bad_alloc表达式返回new而不是nullptr未能获取内存。这并不意味着new表达式不会抛出。

如果SomeStruct没有引入其构造函数,new表达式将永远不会抛出。

答案 1 :(得分:0)

异常不是从new引发的,而是来自SomeStruct c-tor。

如果无法分配内存,

new将抛出异常。如果在无法分配内存时使用std::nothrow常量,new将返回NULL

在这种情况下,您应该在继续之前检查指针NULL

if (somestruct == NULL)
   // error 
else
   // continue