首页 > 解决方案 > Visual Studio Community 2019 中的 C++ 代码分析产生警告 C26486 和 C26414

问题描述

我有以下示例程序

#include <iostream>

class MyClass
{
private:
    int value;
public:
    MyClass(int v) noexcept : value(v) {}
    void displayValue() { std::cout << "The value is " << value; }
};

int main()
{
    auto instance{ std::make_unique<MyClass>(5) };
    instance->displayValue();
}

当我运行代码分析时,我收到以下警告:

main.cpp(15):警告 C26486:不要将可能无效的指针传递给函数。对“MyClass::displayValue”的调用中的参数 0“@instance”可能无效(lifetime.3)。

谁能向我确切解释我应该如何使用std::unique_ptr<MyClass>这里来避免警告?

此外,我在 unique_ptr 的初始化中收到以下警告:

main.cpp(14):警告 C26414:移动、复制、重新分配或重置本地智能指针“实例”(r.5)。

std::make_unique我可以通过包装in的用法来缓解这个问题,std::move但我认为这不是必需的。

编写此代码并避免我从代码分析器收到的警告的正确方法是什么?

标签: c++visual-studiovisual-studio-2019c++-standard-library

解决方案


响应警告 C26414

我通过 GitHub 收到了来自微软的 Colin Robertson 的回复,其解释如下:

此案例属于备注部分的最后一个要点。除非您正在做一些需要保护 unique_ptr 的事情,否则将其声明为 MyClass 实例{5};避免了一些不必要的开销。请记住,警告只是对一般规则的提醒。如果您的具体声明有充分的理由,请有足够的信心忽略它。

他的回复也可以在这里找到以供参考:

https://github.com/MicrosoftDocs/visualstudio-docs/issues/4711

所以,基本上,我们在这里被提醒不要使用堆分配,如果它是不必要的。

响应警告 C26486

无人回答。我已通过 GitHub 请求更多信息,正在等待回复。

2020 年 1 月 29 日更新 - 仍未得到答复。向 Microsoft 开发人员社区提交问题

2020 年 2 月 3 日更新 - 收到来自 Visual Studio 社区(我认为是机器人?)的响应,将问题状态更新为“已分类”。我想这意味着他们正在优先考虑这个问题,也许?如果有兴趣,您可以在此处关注问题。


推荐阅读