是否可以将唯一指针指向共享指针?
Is it ok practice to have a unique pointer pointed at a shared pointer?
我在尝试解决C++中的指针问题时遇到了一些困难。
假设我有一个名为MyClass
的类。在此类中,有一个共享指针指向某个称为MyResource
的外部资源。现在我们再说,在MyClass
中,有几个对象叫做MyObject
的实例。MyObject
的每个实例还需要引用MyResource
。假设这个类除了包含我刚刚提到的这些组件之外什么都不做
class MyClass
{
shared_ptr<MyResource> m_p_my_resource;
MyObject m_my_object1;
MyObject m_my_object2;
MyObject m_my_object3;
}
我以前(尝试)如何实现这一点,我将创建一个共享指针并将其提供给m_p_my_resource
.然后我会给每个MyObject
实例m_p_my_resource
.我假设每当m_p_my_resource
更改为指向新MyResource
时,MyObject
中的每一个也会指向新资源。
但是,我意识到我所做的是不正确的。当我改变m_p_my_resource
时,这确实指向一个新的资源。但是,MyObject
的每个实例仍将指向原始MyResource
。
现在,我正在尝试思考如何实际实现我最初尝试做的事情的方法:能够更改m_p_my_resource
并让每个实例也指向新资源。
解决此问题的一种方法是在m_p_my_resource
更改时更新每个MyObject
实例。我可能需要一个setResource
方法来更新m_p_my_resource
,然后遍历MyObject
的每个实例。
另一种解决方案是让MyObject
的每个实例都包含一个指向MyResource
指针的指针。因此,如果每个MyObject
都指向指向资源的指针而不是资源本身,我可以更改m_p_my_resource
,并且每个对象也能够确定新资源。
虽然第二种方法可能在我上面列出的类示例中有效,但对于类中未包含的MyObject
实例来说,它并不优雅。例如,如果我只是在堆栈上创建了一个MyObject
,我宁愿让它直接指向资源,而不是让它指向指向资源的某个中间指针......
所以我正在尝试确定实现我所描述的内容的最佳方法。我对智能指针仍然相对较新,并且很好奇我试图做的是否愚蠢,或者是否有更好/明显的替代解决方案。
如果MyObject
的生存期确实与MyClass
的生存期相同,那么MyObject
的每个实例都可以保留指向shared_ptr<...>
的引用或指针来实现您想要的。
class MyClass {
public:
shared_ptr<MyResource> resource;
MyObject obj1 { resource };
MyObject obj2 { resource };
};
class MyObject {
public:
shared_ptr<MyResource>& resource;
void foo() {
resource->do_something(); // works transparently
}
}
您可以安全地更改MyClass::resource
的内容:
void bar(MyClass& myClass) {
myClass.resource.reset(new MyResource());
assert(myClass.resource.get() == myClass.ob1.resource.get());
assert(myClass.resource.get() == myClass.ob1.resource.get());
}
双指针是解决问题的正确技术。
但是,我有点困惑,为什么您会像您在标题中所说的那样unique_ptr
shared_ptr
。你没有在问题的任何地方提到unique_ptr
,似乎你真正想要的是一个shared_ptr<unique_ptr<MyResource>>
,而不是一个unique_ptr<shared_ptr<MyResource>>
。
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址