Анализ кода C ++ в Visual Studio Community 2019 выдает предупреждения C26486 и C26414 - PullRequest
1 голос
/ 28 января 2020

У меня есть следующий пример программы

#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: Не передавайте указатель, который может быть недействительным для функции. Параметр 0 '@instance' в вызове 'MyClass :: displayValue' может быть недействительным (продолжительность.3).

Может кто-нибудь объяснить мне, как именно я должен использовать std::unique_ptr<MyClass> здесь, чтобы избежать предупреждения?

Кроме того, я получаю следующее предупреждение при инициализации unique_ptr:

main. cpp (14): предупреждение C26414: Переместить, скопировать , переназначить или сбросить локальный интеллектуальный указатель 'instance' (r.5).

Я могу облегчить эту проблему, обернув использование std::make_unique в std::move, но я не думаю, что это должно быть необходимо.

Как правильно написать этот код и избежать предупреждений, которые я получаю от анализатора кода?

1 Ответ

0 голосов
/ 29 января 2020

В ответ на предупреждение C26414

Я получил ответ от Колина Робертсона из Microsoft через GitHub со следующим объяснением:

Этот случай возникает под последним пунктом в разделе «Замечания». Если вы не делаете что-то, что требует защиты unique_ptr, объявив его как экземпляр MyClass {5}; избегает ненужных накладных расходов. Помните, что предупреждение - это просто напоминание об общем правиле. Если у вас есть веская причина для вашего объявления c, будьте уверены, чтобы его игнорировать.

Его ответ также можно найти здесь:

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

Итак, в основном, мы напоминаем, что здесь не следует использовать выделение кучи, если в этом нет необходимости.

В ответ на предупреждение C26486

без ответа. Я запросил дополнительную информацию через GitHub и жду ответа.

Обновление от 29.01.2020 - все еще без ответа. Отправлена ​​проблема в сообщество разработчиков Microsoft

Обновление 2/3/2020 - Получен ответ от сообщества Visual Studio (бот, я так думаю?) С обновлением статуса проблемы как "Triaged". Я полагаю, это означает, что они расставили приоритеты, может быть? Если интересно, можете следить за вопросом здесь .

...