多个实例持有对 unique_ptr 的引用
Multiple instances holds a reference to a unique_ptr
我正在与时俱进,我想我应该开始一个新项目,目标是更多地使用和接触智能指针。我正在考虑使用 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 引用,因为不允许以任何方式重置或修改指针。
这是一种可行的方法还是我干扰了原力?
我看到两个可能的解决方案。
其中之一可能是您的所有者有 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 拥有所有权,如果你能保证 Owner
的寿命与 SomeContainer
一样长或更长,那么这样的策略没有错。就个人而言,我更喜欢这个:
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() );
}
//...
};
根本不清楚为什么需要在这里使用智能指针。一个简单的成员变量就可以很好地表达所有权:
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
的东西。
我正在与时俱进,我想我应该开始一个新项目,目标是更多地使用和接触智能指针。我正在考虑使用 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 引用,因为不允许以任何方式重置或修改指针。
这是一种可行的方法还是我干扰了原力?
我看到两个可能的解决方案。
其中之一可能是您的所有者有 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 拥有所有权,如果你能保证 Owner
的寿命与 SomeContainer
一样长或更长,那么这样的策略没有错。就个人而言,我更喜欢这个:
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() );
}
//...
};
根本不清楚为什么需要在这里使用智能指针。一个简单的成员变量就可以很好地表达所有权:
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
的东西。