1

我对 SAL 注释和新运算符重载有疑问。我想提供新的运算符,它不会引发异常,但在出现错误时返回 nullptr。我已经写了:

_Check_return_ _Ret_maybenull_ _Success_(return != nullptr) void* operator new(_In_ size_t size)
{
    return malloc(size);
}

不幸的是,VS2012 看到 <new> 标头中提供的新声明是不同的,并且在 Build->Run Code Analysis 之后给了我很多声明不兼容的错误。此外,它选择 <new> 中提供的声明,表明 new 永远不会返回 null。我试图删除 <new> 包含但它没有帮助(它包含在不同的标题中,如 <vector>)。如何说服编译器使用我的 SAL 注释?

4

2 回答 2

0

严格来说,像这样的 STL 类型要求 C++ 异常处理完全有效 (/EHsc)。您可以在没有它的情况下使用它,但这绝对是一个危险的情况。您可以使用 nothrownew.obj,但不建议这样做。

对于调用 new 并且希望它返回 null 而不是抛出异常的情况,在 C++11(VS 2010 或更高版本)中,解决方案是使用 new 的 (std::nowthrow) 版本。

std::unique_ptr<uint8_t[]> temp( new (std::nothrow) uint8_t[ size ] );
if ( !temp )
    return E_OUTOFMEMORY;
于 2014-07-16T07:15:56.383 回答
0

nothrownew.obj如果不抛出新的东西是你真正想要的,你不能只链接吗?

请注意,这通常是一个坏主意。一方面,MSVC 附带的 STL 实现不期望new返回NULL并且不检查它,而是继续前进并使用指针。如果您使用 STL,并且如果您确实耗尽了内存,那么bad_alloc您将获得访问冲突而不是异常 - 几乎没有改进。

于 2013-08-17T00:32:13.327 回答