Я работаю над архитектурой, где мне нужно, чтобы сущность была в другом списке:
Я думаю, что умный указатель — лучшее решение для управления всеми этими ссылками, поэтому я начал изучать его, но у меня есть некоторые проблемы, и я очень удивлен, если использую их правильно.
Объяснения:
У меня есть абстрактный класс: 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 — Мне нужно было использовать тип «Entity» везде в моей программе (в параметрах, …)?
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 в игре, были ли у меня проблемы с производительностью? (Я использую ссылки):
Спасибо за ваше время!
Entity
, но возможно EntityPtr
или что-то подобное. (Entity
предполагает, что его конкретная реализация IEntity
)Component
, но из IComponent
, Ваш Component
умные указатели смогут удерживать объекты типа SpriteComponent
,Ясно на EntityManager.entityList
удалил бы объекты, если бы не было никаких других ссылок. Но ваш код, кажется, делает что-то странное при заполнении вектора.
EntityPtr entity( new IEntity( *this->world ) );
...
this->entityList.add( &entity );
Это добавляет адрес объекта в список объектов, там не должно быть &
там.
Я не уверен, почему это может вызвать утечку, но это определенно неправильно.
Других решений пока нет …