如何将shared_ptr传递给裸ptr函数

时间:2012-10-06 17:14:19

标签: c++ memory-management shared-ptr ownership

我有一个由lib定义的Entity类,Registry是一个用于管理使用地图注册到它的实体的类。

我正在尝试做什么:

//Registry Signature
void Registry::add(Entity* entity);


//my function (IGameEntity subclasses Entity)
void GameLogic::addEntity(shared_ptr<IGameEntity> entity, GameEntityId id) {
 GameEntityId entityId = entity->getId();
 gameEntities.push_back(entity);
 Framework::Registry::instance()->add(entity); //<-- this doesn't work
}

我正在设法如何处理这个问题,因为我保留了shared_ptr,然后我将不得不传递一个指针。

另一件事是,如果注册表因某种原因被破坏,它将在地图中剩余的所有实体上调用delete

如果我通过entity weak_ptr<Entity>(entity)它有效但我还没有完全理解如果Registry调用weak_ptr上的删除会发生什么。

如果我通过entity entity.get(),当引用计数达到零或注册表尝试删除它时会发生什么。

1 个答案:

答案 0 :(得分:3)

您有两种不兼容的所有权方案。

您需要更改其中一个,或者克隆应该从一个方案转移到另一个方案的对象。

当只有一个对象的引用时,有一个释放shared_ptr的技巧。但你不想这样做。即使你对图书馆的内部有足够的了解也可以做到。

因此,作为一种实用的解决方案,请更改注册表内容。

点亮shared_ptr