我有以下示例程序
#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
的用法包装在std::move
中来缓解此问题,但我认为这不是必须的。
编写此代码并避免从代码分析器收到警告的正确方法是什么?
响应警告C26414
[我通过GitHub从Microsoft的Colin Robertson收到了回复,并提供了以下说明:
此案例位于“备注”部分的最后一个要点之下。除非您正在做需要对unique_ptr保护的操作,否则将其声明为MyClass instance {5};避免了不必要的开销。请记住,警告只是对一般规则的提醒。如果您有特定声明的充分理由,请有足够的信心忽略它。
他的回复也可以在这里找到以供参考:
https://github.com/MicrosoftDocs/visualstudio-docs/issues/4711
因此,基本上,在此提醒我们,如果不需要,不要使用堆分配。
响应警告C26486
未回答。我已经通过GitHub请求了更多信息,正在等待回复。
更新2020年1月29日-仍未答复。已提交问题到Microsoft开发者社区
[Update 2/3/2020-从Visual Studio社区(我认为是机器人?)收到答复,将问题的状态更新为“已分类”。我想这意味着他们正在优先考虑这个问题,也许吗?如果感兴趣,可以关注问题here。