std :: weak_ptr 的存储,并使用static_pointer_cast

问题描述 投票:0回答:1

如果将std::weak_ptrstatic_pointer_cast一起存储,引用计数是否仍然有效?

这是一个非常简单的示例(请注意,SmallBoxBigBox类几乎完全相同):

#define OWNER_SMALLBOX    1
#define OWNER_BIGBOX      2

class Object
{
    private:
        std::weak_ptr<void> owner;
        int ownerType;

    public:

        void doSomethingIfOwnerStillExist()
        {
            if(std::shared_ptr<void> ownerShared = owner.lock())
            {
                switch(ownerType)
                {
                    case OWNER_SMALLBOX:
                        std::shared_ptr<SmallBox> smallBox = std::static_pointer_cast<SmallBox>(ownerShared);
                    break;

                    case OWNER_BIGBOX:
                        std::shared_ptr<BigBox> bigBox = std::static_pointer_cast<BigBox>(ownerShared);
                    break;
            }
        }

        Object(std::shared_ptr<void> _owner, int _ownerType)
        {
            owner = _owner;
            ownerType = _ownerType;
        }
};

class SmallBox
{
    private:
        std::list< std::shared_ptr<Object> > objects;

    public:

        static void addObject(std::shared_ptr<SmallBox> _smallBox)
        {
            std::shared_ptr<void> owner = std::static_pointer_cast<void>(_smallBox);
            std::shared_ptr<Object> nObject = std::make_shared<Object>(owner, OWNER_SMALLBOX);
        }
};

class BigBox
{
    private:
        std::list< std::shared_ptr<Object> > objects;
    public:

        static void addObject(std::shared_ptr<BigBox> _bigBox)
        {
            std::shared_ptr<void> owner = std::static_pointer_cast<void>(_bigBox);
            std::shared_ptr<Object> nObject = std::make_shared<Object>(owner, OWNER_BIGBOX);
        }
};

[我知道我可以使SmallBoxBigBox类继承自GeneralBox类,并用void类型替换GeneralBox类型,但是weak_ptr可以指向其他几个以及类型,使继承变得很大而笨拙。

我很好奇shared_ptr是否仍然可以跟踪弱指针转换为void的情况。

c++ smart-pointers static-cast weak-ptr
1个回答
0
投票

如果我正确理解了您的问题,那么您正在询问std::static_pointer_cast是否将返回与调用它的参数共享所有权的std::shared_ptr

答案是肯定的。

owner中的[addObject将与addObject的功能参数共享所有权,对象中的owner将引用相同的控制块,ownerShared中的smallBoxbigBoxdoSomethingIfOwnerStillExist也将引用同一控制块]。

[std::static_pointer_cast如果不返回与该参数共享所有权的实例,那将毫无用处,因为如果不这样做,将不可避免地导致双重删除托管指针。

© www.soinside.com 2019 - 2024. All rights reserved.