関数にアクセスできない例外
Posted: 2018年2月08日(木) 20:11
現在、龍神録の館、龍神録2の館、新ゲームプログラミングの館を参考にシューティングゲームを作っています。そこで、ウィンドウ内にオブジェクトを表示させようと思ってコードをかいたのですが、関数にアクセスできず例外が発生してしまいます。
このようなコードを実行すると、数回は成功するのですが、途中で以下のような例外が発生します。
std::vector<std::shared_ptr<Object>,std::allocator<std::shared_ptr<Object> > >::operator[](...)._Ptr-> が 0xB5B8 でした。
最初の数回は期待通りの実行結果が得られるので、関数自体にアクセスすることは可能なのですが、その後アクセスできなくなっているようです。原因がわかる方、どなたかご教授いただければ幸いです。
// SceneGame.h
#pragma once
#include <vector>
#include <memory>
#include "Object.h"
#include "BaseScene.h"
class SceneGame : public BaseScene {
vector<shared_ptr<Object>> obj;
int stage;
public:
SceneGame(ISceneChanger * ch, const Parameter& parameter);
~SceneGame();
void Update();
void Draw() const;
};
// SceneGame.cpp
#include <DxLib.h>
#include "Pad.h"
#include "Define.h"
#include "SceneGame.h"
#include "Frame.h"
#include "Field.h"
SceneGame::SceneGame(ISceneChanger *ch, const Parameter& parameter) : BaseScene(ch, parameter) {
float arrx[4] = { 0, 0, 0, 416 };
float arry[4] = { 0, 16, 464, 0 };
for (int i = 0; i < 4; i++) {
// 枠オブジェクトを生成
obj.push_back(make_shared<Frame>(i, arrx[i], arry[i]));
}
// フィールドを生成
// この一文を書き足すとエラーが出るようになる
obj.push_back(make_shared<Field>((float)Define::FX, (float)Define::FY));
// 描画優先度によってソート
sort(obj.begin(), obj.end());
}
SceneGame::~SceneGame() {
for (unsigned i = 0; i < obj.size(); i++) {
obj[i].reset();
}
obj.clear();
}
void SceneGame::Update() {
for (unsigned i = 0; i < obj.size(); i++) {
obj[i]->Update();
}
if (Pad::get(PAD_START) == 1) {
Parameter parameter;
changer->ChangeScene(Scene_Title, parameter, TRUE);
}
}
void SceneGame::Draw() const {
for (unsigned i = 0; i < obj.size(); i++) {
obj[i]->Draw(); // ここでエラーが起きる
}
}
// Object.h
#pragma once
#include <memory>
using namespace std;
class Object {
protected:
float x, y;
int priority = 0;
public:
Object();
Object(float _x, float _y);
~Object() = default;
virtual void Update() = 0;
virtual void Draw() const = 0;
bool operator() (const shared_ptr<Object> left, const shared_ptr<Object> right) const {
return left->priority < right->priority;
}
void setPos(float _x, float _y);
void addPos(float _x, float _y);
float getX();
float getY();
};
// Field.h
#pragma once
#include <vector>
#include <memory>
#include "Object.h"
using namespace std;
class Field : public Object {
vector<shared_ptr<Object>> obj;
int i;
public:
Field() = default;
Field(float _x, float _y);
~Field() = default;
void Update();
void Draw() const;
};
std::vector<std::shared_ptr<Object>,std::allocator<std::shared_ptr<Object> > >::operator[](...)._Ptr-> が 0xB5B8 でした。
最初の数回は期待通りの実行結果が得られるので、関数自体にアクセスすることは可能なのですが、その後アクセスできなくなっているようです。原因がわかる方、どなたかご教授いただければ幸いです。