[英]How to avoid circular references with member callbacks & shared_ptr?
[英]Member objects, references and shared_ptr
因此,我發現自己經常這樣做,並且想知道這是否正確(這可能無法編譯-我正在用手機編寫此代碼):
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
帶有指向被破壞對象的無效指針?(我是否以回旋方式返回臨時地址)?)
我沒有看到其他范圍/ GC問題嗎?
有沒有更簡單的方法可以做到這一點?
CreateStuff
絕對是錯誤的。 您(最終)將一個指向局部變量的指針傳遞給shared_ptr
,該變量的壽命超過了該變量。 一旦超出范圍,這些_shared
內將有兩個懸空指針。
由於您正在使用智能指針,為什么不在堆棧上動態分配該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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.