所以我有3节课。一个主要的类,ClassA,一个基类,ClassB和一个继承的类,ClassC,然而,当我关闭我的程序时,我得到一个“访问冲突写入位置”错误。
以下是设置:
ClassA .h
ClassA
{
public:
ClassA(void) : player_(NULL), bullet_(NULL) {};
~ClassA(void);
void Update();
void fireBullet(int posx, int posy, int speed);
private:
ClassB* player_;
ClassB* bullet_;
};
ClassA .cpp
void ClassA::Update()
{
ClassA* pointer = this;
player_->Update(*pointer);
if(bullet_->IsAlive())
bullet_->Update(*pointer);
}
void fireBullet(int posx, int posy, int speed)
{
//make it active, set its position and speed
}
B类只是基类,因此我只发布C类
ClassC .h
ClassC : public ClassB
{
public:
ClassC() : posx_(0), posy_(0) {};
virtual void Update(ClassA &a);
private:
int posx_;
int posy_;
}
ClassC .cpp
void ClassC::Update(ClassA &a)
{
if(spacebar == pressed)
a.fireBullet(posx_, posy_, 10);
}
我觉得我在某处有引用错误,但我不知道在哪里。问题只发生在子弹产生时,如果我不在整个程序中按空格键然后关闭它,程序将正常退出。但是,如果我在运行时按空格键,则会导致访问冲突错误。我检查了ClassA析构函数,但是在析构函数中是否存在某些问题时会出现问题。
我试图只显示问题的相关代码。有一个初始化函数可以初始化bullet_和player_但是没有看到它与问题相关。
析构函数:
ClassA的 ClassA的::〜ClassA的(无效) { 删除player_; 删除bullets_; }
ClassB和ClassC
~Class {};
另外,player_和bullet_在ClassA的函数中初始化:
ClassA::Initialise()
{
ClassB* player = new ClassC;
player->Initialise();
player_ = player;
ClassB* bullet = new ClassD; //ClassD is also inherited from B
bullet->Initialise();
bullet_ = bullet;
}
答案 0 :(得分:0)
我可以注意到的一个错误是您在ClassC :: Update(ClassA& a)中通过引用发送ClassA,然后在此之后将其用作指针。 试着写
void ClassC::Update(ClassA &a)
{
if(spacebar == pressed)
a.fireBullet(posx_, posy_, 10);
}
另外,请发送构造函数,析构函数,对象创建等代码。
答案 1 :(得分:0)
因为您的程序在结束后获得访问冲突。这意味着错误在析构函数中。有时在没有显式调用的情况下调用析构函数。但是你在发布的文件中,现在有这样的隐藏调用。这意味着错误在你的析构函数中。
ClassA ClassA:: ~ClassA(void)
{
delete player_;
delete bullets_;
}
所以这段代码会导致问题。因为如果指针是nullptrs或只是一些垃圾,将会有访问冲突。为了避免它,我建议检查它们。
ClassA ClassA:: ~ClassA(void)
{
if ( player_ )
{
delete player_;
player_ = nullptr; // or NULL if it's not c++0x
}
if ( bullets_ )
{
delete bullets_;
bullets_ = nullptr;
}
}
但为了使这段代码真正得到保护,你必须要这样做 1.在构造函数中将它们设置为nullptr 2.在callin delete之后将它们设置为nullptr。
就是这样。如果有帮助,请回信。
MarkGrin