【问题标题】:How to create a std::shared_ptr without violating MISRA C++ 2008 Advisory Rule 14-8-2?如何在不违反 MISRA C++ 2008 咨询规则 14-8-2 的情况下创建 std::shared_ptr?
【发布时间】:2013-08-02 11:57:05
【问题描述】:

我在 PC-Lint (au-misra-cpp.lnt) 中收到此错误:

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, 模块 Parameter.cpp), std::shared_ptr::shared_ptr (行 485,文件 C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory,模块 Parameter.cpp)) C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\memory(499):错误 830: (信息——先前消息中引用的位置) std::shared_ptr info(infoPtr);

关于此代码:

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

我尝试以不同的方式编写代码,但找不到不出现上述错误的方式。

是否可以使代码符合 MISRA?

【问题讨论】:

  • 你试过std::shared_ptr&lt;CParameterInfo&gt; info(new CParameterInfo());吗?或者更好,auto info = std::make_shared&lt;CParameterInfo&gt;();?
  • 我想问题在于std::shared_ptr 的构造函数既是模板又不是模板,你对此无能为力。如果我理解正确,恕我直言,这条规则太严格了。
  • @CassioNeri 您可能是对的,这似乎是 shared_ptr 实现中的一个问题,并且它具有具有相同签名的模板和函数,从而使 PC-Lint 显示 MISRA 错误。 Bur 它在使用 make_shared 时有效,所以我会这样做。

标签: c++ misra


【解决方案1】:

我猜想避免构造函数可能会起作用:

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

这还有一个优点是只分配一次内存,而单独创建对象和共享状态需要两个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多