簡體   English   中英

成員對象,引用和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超出范圍,使ab帶有指向被破壞對象的無效指針?(我是否以回旋方式返回臨時地址)?)

  • 我沒有看到其他范圍/ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM