c++ - 如何将 shared_ptr 传递给 naked ptr 函数

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

我有一个 Entity由 lib 和 Registry 定义的类这是管理使用 map 注册到它的实体的类。

我正在尝试做的事情:

//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在 map 中剩余的所有实体上。

如果我通过 entityweak_ptr<Entity>(entity)它有效,但我没有完全理解如果 Registry 会发生什么在 weak_ptr 上调用 delete。

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

最佳答案

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

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

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

因此,作为一个实用的解决方案,更改注册表。

让它接受一个shared_ptr

关于c++ - 如何将 shared_ptr 传递给 naked ptr 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761960/

相关文章:

c++ - 类方法和参数传递

c++ - 哪个更快 : Assigning same value to a variable, 或找出它是否已经设置?

c++ - 树状结构中的内存前向预留

c - 在另一个函数中分配的动态数组

C++ - 删除 std::string*;堆损坏

c++ - 返回 shared_ptr 中的对象时 RVO 会工作吗?

c++ - 了解 bool 运算符==(参数1,参数2)

c++ - 在 QSqlTableModel 的 QTableView 列中显示图像

c++ - Boost::HPC 侵入式

c++ - 带 malloc 和 free 的 shared_ptr