我与时俱进,并认为我应该开始一个新项目,目标是使用并向智能指针展示自己。我想到了一大堆unique_ptr
存储碰撞组件。这些组件将由const ref传递给四元树,该四元树在内部执行ptrs上的只读操作
我已经写了一个简化的例子来反映我的实施意图。
struct Owner
{
unique_ptr<int> uPtr;
};
struct SomeContainer
{
list<const unique_ptr<int>*> uPtrList;
void Insert( const unique_ptr<int>& borrowedUPtr )
{
list.push_back( &borrowedUPtr );
}
void DoSomething()
{
for( const auto& ptr : uPtrList )
// Perform read ops
}
};
这些是我的意图:
Owner
拥有unique_ptr
,从而控制其生命周期。
SomeContainer
将存储对指针的const引用,因为它不允许以任何方式重置或修改指针。
这是一种可行的方法还是我扰乱了这种力量?
答案 0 :(得分:4)
我看到两种可能的解决方案。
其中一个可能是您的所有者拥有std::shared_ptr
而SomeContainer
保留了std::weak_ptr
的列表,如下所示:
struct Owner
{
std::shared_ptr<int> uPtr;
};
struct SomeContainer
{
list<std::weak_ptr<int>> uPtrList;
void Insert( std::shared_ptr<int> borrowedUPtr )
{
list.push_back( std::weak_ptr<int>(borrowedUPtr) );
}
//...
};
另一个可能是SomeContainer
保留通过std::unique_ptr::get
获得的const原始指针的列表。由于所有者拥有所有权,如果您可以保证Owner
的生存时间长于SomeContainer
,则此类策略没有任何问题。 Personnaly,我更喜欢这个:
struct Owner
{
unique_ptr<int> uPtr;
};
struct SomeContainer
{
list<const int*> uPtrList;
//Could also be directly passed as a const int*
void Insert( const unique_ptr<int>& borrowedUPtr )
{
list.push_back( borrwedUPtr.get() );
}
//...
};
答案 1 :(得分:2)
目前尚不清楚为什么你需要在这里使用智能指针。一个简单的成员变量就表达了所有权:
struct Owner
{
int value;
};
然后观察者可以存储一个原始指针:
struct SomeContainer
{
list<const int*> ptrList;
void Insert( const int& borrowedValue)
{
ptrList.push_back( &borrowedValue);
}
void DoSomething()
{
for( const auto& ptr : ptrList)
// Perform read ops
}
};
这是假设您可以确信所有者将在观察者希望观察时保持活力。如果您对此无法自信,那么unique_ptr
将无法帮助您,您将需要weak_ptr
与shared_ptr
之类的内容。