我对SAL注释和new运算符重载有问题。我想提供新的运算符,它不抛出异常,但在出错时返回nullptr。我写过:
_Check_return_ _Ret_maybenull_ _Success_(return != nullptr) void* operator new(_In_ size_t size)
{
return malloc(size);
}不幸的是,VS2012在header中提供的声明与构建后的不同->运行代码分析给了我很多声明不兼容的错误。此外,它选择了一个声明,该声明中提供了new从不返回null的声明。我试图删除include,但没有帮助(它被包含在不同的头中,如)。如何说服编译器使用我的SAL注释?
发布于 2013-08-17 08:32:13
如果不抛出新的东西是你真正想要的,你就不能直接链接到nothrownew.obj吗?
但请注意,这通常是一个糟糕的想法。首先,MSVC附带的STL实现并不期望new返回NULL,也不检查它,而是直接使用指针。如果您使用STL,如果您确实耗尽了内存,那么您将得到访问冲突,而不是bad_alloc异常-几乎没有任何改进。
发布于 2014-07-16 15:15:56
严格地说,像这样的STL类型要求C++异常处理完全有效(/EHsc)。你可以在没有它的情况下使用它,但这绝对是一个危险的情况。您可以使用nothrownew.obj,但不推荐这样做。
在C++11 (VS2010或更高版本)中,如果您要调用new,并且希望它返回null而不是抛出异常,那么解决方案就是使用new的(std::nowthrow)版本。
std::unique_ptr<uint8_t[]> temp( new (std::nothrow) uint8_t[ size ] );
if ( !temp )
return E_OUTOFMEMORY;https://stackoverflow.com/questions/18276250
复制相似问题