我敢肯定这很简单,但是我对智能指针还很陌生,我找不到答案。

场景非常简单:
我有一个类A,它为某些对象X持有一个shared_ptr:

class A{
    shared_ptr<const X> _asX;
}


现在,在一系列函数调用之后,我正在创建一个类型为B的新对象,该对象也包含此X。类似:

class B {
private:
    shared_ptr<const X> _bsX;
public:
    B(): _bsX(nullptr) // - maybe this is problematic {}
    foo(shared_ptr<const X>& x)
    {
        _bsX = x;
        // The line above gives me undefined behavior,
        // and when I run valgrind I get "Conditional jump or move
        // depends on uninitialized value(s)",
        // telling me this is not the correct way to do things.
    }


请注意,这是故意的,foo会真正设置_bsX的值,而不是构造函数。

因此,如上所述,根据编译器的不同,我会遇到分段错误-这通常意味着某些值未初始化,后来被valgrind确认。

所以我该怎么办-我尝试使用'reset'等。但是我很困惑,我要求您的帮助。
可能是const吗?还是通过引用传递?或“ =”运算符。

当我们使用它时-我应该将X及其包装器(shared_ptr)传递给foo,还是应该传递原始指针,然后使其共享?如果是这样,请您举个例子。我也尝试过,但出现错误。

最佳答案

好的,我发现了问题,它根本与智能指针无关,但是由于我是新手,所以我认为可能是这样。
我将这个答案留作以后参考。这是我所做的(简体):

class A{

private:

    shared_ptr<const int> _num;

public:
    A()
    {
        _num = make_shared<const int>(5);
    }

    const shared_ptr<const int>& getNum() const {return _num; }

    void printNum()
    {
        cout << *_num.get() << endl;
    }
};

class B
{


public:

    struct C{
        C() : _num(nullptr){}
        void boo(shared_ptr<const int> & num) { _num = num;}
        shared_ptr<const int> _num;
    };

    B() {}

    void foo(shared_ptr<const int>& num)
    {
        cs.reserve(2);
        for (uint32_t i = 0; i < 2 ; ++i) {

            cs.push_back(C()); // This was missing.
            cs[i].boo(num);
        }
    }

    void printCNum()
    {
        for (C c : cs) {
            cout << *c._num.get() << endl;
        }
    }

private:

    vector<C> cs;
};


int main()
{
    A a{};
    shared_ptr<const int> xx = a.getNum();

    B b{};
    b.foo(xx);

    a.printNum();
    b.printCNum();

}


愚蠢的我,我认为当您保留对象的向量(不是指针/引用)时,它也会调用其构造函数。事实并非如此。具体来说,我增加了向量的容量,但没有增加其大小。

关于c++ - 处理shared_ptr时未初始化的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56151291/

10-11 15:33