【发布时间】:2020-01-28 19:27:48
【问题描述】:
我有以下示例程序
#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 中来缓解这个问题,但我认为这没有必要。
编写此代码并避免我从代码分析器收到的警告的正确方法是什么?
【问题讨论】:
-
代码很好,只是缺少
#include<memory>。它不应产生警告。std::move是多余的和悲观的。请逐字显示生成警告和其他警告的确切代码。 -
auto instance{ std::move(std::make_unique<MyClass>(5)) }应该是auto instance{std::make_unique<MyClass>(5) }或auto instance = std::make_unique<MyClass>(5) -
抱歉,
#include<utility>也不见了。 -
有时强制移动实际上对性能有害..
-
@walnut 我将按照建议添加包含指令。我还用关于第二个警告的详细信息更新了原始问题。
标签: c++ visual-studio visual-studio-2019 c++-standard-library