SAL注释和新的运算符重载

时间:2013-08-16 14:55:08

标签: visual-c++ visual-studio-2012 annotations

我有SAL注释和新运算符重载的问题。我想提供不抛出异常但在发生错误时返回nullptr的新运算符。我写了:

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

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

2 个答案:

答案 0 :(得分:0)

如果你真正想要的非投掷新品,你不能只与nothrownew.obj联系吗?

请注意,这通常是一个坏主意。首先,MSVC附带的STL实现不期望new返回NULL并且不会检查它,而是直接使用指针。如果您使用STL,并且内存不足,那么除了bad_alloc例外,您将获得访问冲突 - 几乎没有改进。

答案 1 :(得分:0)

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

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

std::unique_ptr<uint8_t[]> temp( new (std::nothrow) uint8_t[ size ] );
if ( !temp )
    return E_OUTOFMEMORY;