2013-08-01 36 views
1

我在PC - 皮棉(AU-MISRA-cpp.lnt)收到此錯誤:如何在不違反MISRA C++ 2008諮詢規則14-8-2的情況下創建std :: shared_ptr?

ParameterTest.cpp(40):錯誤1963:(注 - MISRA C++ 2008 諮詢規則違反14- 8-2,可行集包含功能和模板: std :: shared_ptr :: shared_ptr(行 499,文件C:\ Program Files文件(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ memory,模塊參數.cpp),std :: shared_ptr :: shared_ptr(行 485,文件C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ include \ memory,module Parameter.cpp))C:\ Program Files x86)\ Microsoft Visual Studio 11.0 \ V C \ include \ memory(499):error 830: (Info - 先前消息中引用的位置) std :: shared_ptr info(infoPtr);

在此代碼:

CParameterInfo* infoPtr = new CParameterInfo(); 
std::shared_ptr<CParameterInfo> info(infoPtr); 

我試着寫以不同的方式的代碼,但不能找到一種方式,不給上述錯誤。

是否可以使代碼MISRA兼容?

+3

你試過'std :: shared_ptr 信息(新CParameterInfo());'?甚至更好,'auto info = std :: make_shared ();'? –

+0

我想問題是'std :: shared_ptr'具有既是模板又沒有模板的構造函數,你無法做任何事情。如果我理解正確,恕我直言,規則太嚴格。 –

+0

@CassioNeri你可能是正確的,它似乎是在執行shared_ptr的問題,並且它具有相同簽名的模板和函數,使PC-Lint顯示MISRA錯誤。 Bur使用make_shared時有效,所以我會這麼做。 – MathiasWestin

回答

4

我猜想,避免了構造可能的工作:

auto infoPtr = std::make_shared<CParameterInfo>(); 

這也有隻做單一的內存分配的優勢,而對象和共享狀態的單獨的建立將需要兩個。

+0

謝謝,這對我很有用。 – MathiasWestin

相關問題