正确使用智能指针而不会泄漏

时间:2012-09-12 09:24:06

标签: c++ shared-ptr smart-pointers

我正在开发一个架构,我需要在不同的列表中创建一个实体:

  • 渲染器 - >组件列表(SpriteComponent)
  • Collisioner - >组件列表(PhysicComponent)

我认为智能指针是管理所有这些参考文献的最佳解决方案,所以我开始学习它,但是我遇到了一些问题,如果我正确使用它们,我会感到非常兴奋。


解释:

我有一个抽象类:IEntity

class IEntity {
  public:
    IEntity( World& world );
  private:
    World* world;
  public:
    std::tr1::weak_ptr<IEntity> weak_this;
};

typedef std::tr1::shared_ptr<IEntity> Entity;

我有一个在EntityManager中创建实体的方法:

Entity EntityManager::createEntity() {
    Entity entity( new IEntity( *this->world ) );
    entity->weak_this = entity;
    this->entityList.add( &entity );
    return entity;
}

在我的EntityManager类中,我有一个“Entity”的矢量(of shared_ptr):

std::vector<Entity> entityList;

1 - 我是否需要在程序中的任何地方使用“实体”类型(参数,......)?

2 - 如果我有这个:

class IComponent {
  public:
    IComponent();    
};
typedef std::tr1::shared_ptr<IComponent*> Component;

我有一个这样的对象:

class SpriteComponent : public Component {
  public:
    SpriteComponent();        
    int texture;
};

从shared_ptr继承是好的吗?对我来说这看起来很奇怪,但那工作。

3 - 我尝试使用此功能创建10000个实体:

Entity entity = world.getEntityManager().createEntity();

对实体的引用是推入我的“实体”向量,如果我真的理解了智能指针,那么清除向量将删除所有实体(因为没有其他引用)。但是当我查看cXode泄漏分析器时,我可以看到内存增长而没有删除实体。所以我只是尝试在我的载体中创建实体并且我没有泄漏,为什么?问题出在哪儿 ? OO。

4 - 如果我在游戏中使用smart_ptr,我是否有一些性能问题? (我正在使用参考资料):

谢谢你的时间!

1 个答案:

答案 0 :(得分:0)

  1. 我不会称之为Entity,但可能是EntityPtr或其他类似的。 (Entity假设它是IEntity
  2. 的具体实现
  3. 不是来自Component,而是来自IComponent。然后,您的Component智能指针将能够保存SpriteComponent类型的对象。
  4. 如果没有其他参考,EntityManager.entityList上的清除将删除对象。但是在填充向量时,你的代码似乎做了一些奇怪的事情。

    EntityPtr entity( new IEntity( *this->world ) );
    ...
    this->entityList.add( &entity );
    

    这会将实体的地址添加到实体列表中,那里不应该有&。 我不确定为什么这会导致泄漏 - 但它肯定是错误的。

  5. 是的,使用智能指针会降低性能。但是不要担心它,直到你可以把它作为你的核心循环中的一个问题来衡量 - 它可能永远都不足以成为惩罚。