我敢肯定这很简单,但是我对智能指针很新,我找不到这个答案。
场景非常简单:我有一个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();
}
愚蠢的我,我认为当您保留对象的向量(而不是指针/引用(时,它也称为其构造函数。事实证明不是。具体而言,我增加了向量的能力,但没有增加其大小。