我正在尝试编写一个实体组件系统,该系统将允许我使用管理器类随意创建和删除实体类,而不必在完成后过多担心内存管理。
它看起来像这样:
class Entity {
int testInt = 0;
public:
Test(int a) {
testInt = a;
}
int getTestInt() { return testInt; }
}
class EntityManager {
public:
inline static std::vector< std::unique_ptr<Entity> > EntityVector = {};
static Entity& createEntity(int a) {
auto* e = new Entity(a);
EntityVector.push_back(std::unique_ptr<Entity>(e));
return *e;
}
// should delete an entity through erasing its unique_ptr
// by comparing the testInt value to the given argument
static void destroyEntity(int a) {
EntityVector.erase(
std::remove_if(
EntityVector.begin(),
EntityVector.end(),
[a] (const std::unique_ptr<Entity> ¤tEntity) -> bool {
return currentEntity->getTestInt() == a;
}),
EntityVector.end()
);
}
};
整个问题更大,但这部分产生了问题。
现在,当我使用Entity
创建EntityManager::createEntity()
时,一切正常,但是当我去手动删除Entity
或通过{{1 }}我编写的函数似乎并没有被删除,尽管据我所知,删除delete
会调用它所指向的对象的析构函数。但是之后,我仍然可以访问destroyEntity
。这是一个示例:
unique_ptr
哪个输出
Entity
我的问题是:为什么删除int a = 5;
Entity testEntity = TestManager::createEntity(a);
// works as expected, outputs 5
std::cout << testEntity.getTestInt() << std::endl;
// does not appear to properly destroy the entity
TestManager::destroyEntity(5); // same thing happens with a passed as an argument
// still prints 5
std::cout << testEntity.getTest() << std::endl;
并没有真正删除它指向的5
5
?