所以,我发现自己做了很多,并想知道这是否正确(这可能不会编译 - 我在手机上写这个):
class Shared
{
private:
int _x;
public:
void X(int newValue) { _x = newValue; }
int X() { return _x; }
Shared(void) : _x(0)
{
}
};
class Owner
{
private:
shared_ptr<Shared> _shared;
public:
const Shared& Shared() const
{
return *_shared;
}
void Shared(const Shared& newValue)
{
_shared.reset(&newValue);
}
void DoSomethingWithShared()
{
/// yeah, this could be cleaner, not the point!
_shared.X(_shared.X() + 1);
}
};
void CreateStuff(Owner& a, Owner &b)
{
Shared s;
a.Shared(s);
b.Shared(s);
}
int main(int argc, char *argv[])
{
Owner a;
Owner b;
CreateStuff(a,b);
a.DoSomethingWithShared();
b.DoSomethingWithShared();
///...
/// "Shared" instance created in CreateStuff() hopefully lives until here...
}
这个想法是Owner
的多个实例需要类型为Shared
的共享资源。
CreateStuff()
出错? (即s
是否超出范围,a
和b
指向被破坏对象的无效指针?(我是否以迂回方式返回临时地址?)< / p>
我还没有看到任何其他范围/ GC问题吗?
有更简单的方法吗?
答案 0 :(得分:1)
CreateStuff
肯定是错误的。您(最终)将指向局部变量的指针传递到shared_ptr
s,这比该变量更长。一旦它超出范围,你将在_shared
s内有两个悬空指针。
由于您正在使用智能指针,为什么不在堆上动态分配Shared
,让智能指针担心在完成后删除它?
void CreateStuff(Owner& a, Owner &b)
{
std::shared_ptr<Shared> s(new Shared);
a.Shared(s); // have that Shared() modified to take the shared_ptr,
b.Shared(s); // of course
}