处理共享_ptr时非初始化的价值



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

场景非常简单:我有一个a类,可以将共享_ptr保存到某个对象x:

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确认。

所以我该怎么办 - 我尝试使用"重置"等。但是我很困惑,我会寻求您的帮助。可以是const吗?还是通过引用?或'='运算符。

我们在使用它时 - 我应该将其包装器(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();
}

愚蠢的我,我认为当您保留对象的向量(而不是指针/引用(时,它也称为其构造函数。事实证明不是。具体而言,我增加了向量的能力,但没有增加其大小。

相关内容

  • 没有找到相关文章

最新更新