如果将std::weak_ptr
与static_pointer_cast
一起存储,引用计数是否仍然有效?
这是一个非常简单的示例(请注意,SmallBox
和BigBox
类几乎完全相同):
#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);
}
};
[我知道我可以使SmallBox
和BigBox
类继承自GeneralBox
类,并用void
类型替换GeneralBox
类型,但是weak_ptr
可以指向其他几个以及类型,使继承变得很大而笨拙。
我很好奇shared_ptr
是否仍然可以跟踪弱指针转换为void的情况。
如果我正确理解了您的问题,那么您正在询问std::static_pointer_cast
是否将返回与调用它的参数共享所有权的std::shared_ptr
。
答案是肯定的。
owner
中的[addObject
将与addObject
的功能参数共享所有权,对象中的owner
将引用相同的控制块,ownerShared
中的smallBox
和bigBox
,doSomethingIfOwnerStillExist
也将引用同一控制块]。
[std::static_pointer_cast
如果不返回与该参数共享所有权的实例,那将毫无用处,因为如果不这样做,将不可避免地导致双重删除托管指针。