2013-08-16 49 views
0

我有SAL批註和新操作員重載的問題。我想提供新的運算符,它不會拋出異常,但在出錯時返回nullptr。我已經寫:SAL批註和新操作員重載

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

不幸的是VS2012看到的<新>頭是不同的,後建設 - >運行代碼分析給了我很多錯誤的認爲聲明是不兼容的提供了新的聲明。此外,它選擇在<新>中提供的聲明,其指示新的永不返回空值。我試圖刪除<新的>包括但它沒有幫助(它包括在不同的標題,如<矢量>)。我如何說服編譯器使用我的SAL註釋?

回答

0

難道你不能只與nothrownew.obj鏈接,如果不投擲新的是你真正想要的?

請注意,這通常是一個壞主意。首先,MSVC附帶的STL實現不會期望new返回NULL,並且不會檢查這一點,而是直接前進並使用指針。如果你使用STL,並且你的內存不足,那麼你會得到一個訪問衝突,而不是bad_alloc異常 - 這幾乎沒有什麼改進。

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;