私には分からないセグメンテーションの問題があります。それは私が取り組んでいる小さなゲームエンジンのためのEntityManager
からです。 Ship Entity
を追加できますが、船は1 Bullet Entity
を追加できますが、1を超えると追加しようとするとsegfaultsとなりますBullet
。私は今、この1日のためにこれをfiggureしようとしています。以下は、実際のコードからの抜粋です。実際のコードでunique_ptrの削除中のベクトル?
#include <vector>
#include <memory>
struct EntityManager;
struct Entity {
Entity(EntityManager* manager) : manager(manager) { }
virtual ~Entity() { }
virtual void update() = 0;
EntityManager* manager;
};
struct EntityManager {
void update() {
for (auto& entity : entities) {
entity->update();
}
}
void add(Entity* e) {
entities.emplace_back(e);
}
std::vector<std::unique_ptr<Entity>> entities;
};
struct Bullet : public Entity {
Bullet(EntityManager* manager) : Entity(manager) { printf("Bullet ctor\n"); }
virtual void update() override { }
};
struct Ship : public Entity {
Ship(EntityManager* manager) : Entity(manager) { }
virtual void update() override {
printf("Adding Bullet\n");
manager->add(new Bullet(manager));
}
};
int main() {
EntityManager manager;
manager.add(new Ship(&manager));
int loops{0};
while (loops < 100) {
manager.update();
loops++;
printf("Completed Loop #%d\n", loops);
}
return 0;
}
、すべてが自分自身の.h/.cppのファイルを、代わりに構造体のクラスであるが、問題は同じです。 SIGSEGV(セグメンテーション障害)
は、セグメンテーション違反はentity->update();
ライン上EntityManager::update()
で起こる: 出力//完了ループ#1 //弾丸//ブレットCTOR //信号を加算弾丸//ブレットCTOR追加 `あります。
エンティティの 'manager'ポインタを更新するために' EntityManager'はカスタム移動操作を必要とします。 – dyp
エンティティを更新すると、そのループはイテレータを無効にするエンティティを追加します。ループ中にベクターに追加することはできません。 – Galik
[エンジンではないゲームを書く](http://geometrian.com/programming/tutorials/write-games-not-engines/)は読むのが良いことです。つまり、即座にイベントを追加したり、イベントを即座に破棄したりするのではなく、更新ループ後、イベントなど、適切なイベントを介して遅延操作を行い、イテレータを無効にすることはできません。 – aslg