微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在传递共享 ptr 对象时会收到 c26486 警告

如何解决为什么在传递共享 ptr 对象时会收到 c26486 警告

我编写了一些测试代码,用于 vs2019 中的 c++ 指南代码检查器。我收到以下警告,但不知道如何摆脱它们。

第 60 行 - 警告 C26486:不要将可能无效的指针传递给函数调用 'call' 的参数 0 '@@v' 可能无效 (lifetime.3)。

第 79 行警告 C26486:不要将可能无效的指针传递给函数调用 'call' 的参数 0 '@a' 可能无效 (lifetime.3)。

#include <memory>
#include <string>
#include <iostream>
#include <vector>

using namespace::std;
class IReconQElem {

public:
    virtual string getDesc() = 0;
};
class classA : public IReconQElem {

public:
    int a;
    int b;
    string desc;
    string getDesc() override {
        return desc;
    }

    classA(int a) noexcept {
        this->a = a;
        b = 0;
    }
    virtual ~classA() {

    }

};

static void g(string a) {
    cout << a;
}

typedef shared_ptr<IReconQElem> IReconQElemPtr;
typedef vector<IReconQElemPtr>  IReconQElemPtrsV;
IReconQElemPtrsV v;

static IReconQElemPtr func(IReconQElemPtr tid)
{

    v.push_back(tid);
    IReconQElemPtr ptr;
    for (auto& elem1 : v) {
        g(elem1->getDesc()); //this generates the warning
        break;
    }
    return ptr;
}

int main()
{
    IReconQElemPtr tid = make_shared<classA>(1); 
    IReconQElemPtr tid1 = make_shared<classA>(2);
    v.push_back(tid);
    v.push_back(tid1);

    auto a = func(tid);
    auto a1 = func(tid1);
    auto copy = a;
    g(a->getDesc()); //this generates the warning
    return 0;
}

解决方法

警告是正确的,elem1 中的 funca 中的 main 都可能是持有 shared_ptrnullptr。您可以使用 gsl::not_null 明确指出指针不能为 nullptr

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。