2012-09-12 59 views
0

我工作的一个架构,我需要有一个实体在不同的表像:正确使用智能指针无泄漏

  • 渲染 - >组件(SpriteComponent)的名单
  • Collisioner - >组件列表(PhysicComponent)

我认为智能指针是管理所有这些引用的最佳解决方案,所以我开始学习它,但我有一些问题,我SOR河畔,如果我使用它们正确。


吃茶:

我有一个抽象类: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类中,我有一个“实体”(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泄漏分析器查看时,我可以看到内存在未删除Entity的情况下正在增长。所以我只是试图创建实体与插入我的载体,我没有泄漏,为什么?哪里有问题 ?吴。

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

感谢您的时间!

回答

0
  1. 我不会称之为Entity,但也许EntityPtr或一些这样的。 (Entity诉诸于其具体实施IEntity
  2. 不得自Component,而是从IComponent得出。您的Component智能指针将可以容纳SpriteComponent类型的对象。
  3. 清除EntityManager.entityList将删除对象,如果没有其他参考存在。但是你的代码在填充向量时似乎做了一些奇怪的事情。

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

    这增加了实体到实体列表的地址,不应该有一个&那里。 我不知道为什么这会导致泄漏 - 但它肯定是错误的。

  4. 是的,使用智能指针会有性能损失。但是,直到你可以把它作为核心循环中的一个问题来衡量的时候,不用担心它 - 可能永远不会有足够的惩罚来处理。