2010-02-13 73 views
1

后,我选择调试它在MVS2010请查看坠毁的这一形象: http://i48.tinypic.com/dr8q9u.jpg写入类指针给了我一个访问冲突错误

这里的Game.h头,显示了游戏类结构,在图片中,您将看到导致访问冲突的违规方法(setBot(botInfo * b))。

class botInfo; // Forward declaration 

class Game { 
int gameState; 
int flagDropTime; 
botInfo * bot; 
public: 
Game(); 
~Game(void); 
void startGame(); 
void gameOver(int victoriousTeam); 
void resetBall(); 
void hideBall(); 
int getState(); 

void setBot(botInfo * bot); 
botInfo * getBot(); 
}; 

从botInfo(另一个类)我打电话与该码的函数的一个实例, (游戏_dsbTrench是botInfo实例的成员变量)。

botInfo * botPointer = this; 
_dsbTrench->setBot(botPointer); 

问题是,每当我把这种导致异常:在MERVBot.exe在0x72332569(PubBot.dll) 未处理的异常:0000005:访问冲突写入位置0xcdcdcdd5。

那么这个错误是什么原因?我该如何解决它?

谢谢。

回答

0

我不认为有足够的信息可以帮助我。但是我会努力的。

您正在写入未由操作系统分配给您的程序的内存 - 您在写入内容之前需要分配内存。

  1. 您不应该将此参数传递给其他函数 - 您的偏移量计算可能是关闭的 - 您不能使用参考吗? 。
  2. 你为dsbtrench分配了内存吗?

- 编辑 -

作为由其它的答案中提到 “0xCDCDCDCD” 是用于初始化字的前哨变量。

+0

我没有为_dsbTrench分配的内存,我刚刚宣布它使用游戏_dsbTrench。我不熟悉C++和C++中的类,但是我认为我曾经声明类的构造函数会自动调用? – Weasal 2010-02-13 15:08:53

+0

如果声明没有提供参数,它的默认构造函数会自动调用,是的。提供的课程没有构造函数 - 或者如果构造函数的构造函数不是由您指定的默认构造函数,就是默认的加上其他构造函数。 – 2010-02-13 15:12:33

+0

是的,解决了这个问题。我宣布_dsbTrench = new Game();在使用_dsbTrench-> setBot()之前,它工作。谢谢 – Weasal 2010-02-13 15:15:22

0

您是否调试过该代码?当你为它调用setBot方法时,似乎_dsbTrench为null。只要你知道你在做什么就可以传递“this”指针:)

+0

_dsbTrench不为NULL,它是0xCDCDCDCD。 – 2010-02-13 15:22:10

+0

并且这是我的答案是-1的原因? sheeesh ... – grapkulec 2010-02-13 15:40:25

2

0xCDCDCDCD是MS C运行时用来填充新分配的内存的标志值。在你的“_dsbTrench-> setBot(botPointer);”中,_dsbTrench是0xCDCDCDCD--这显然是一个假指针。你有可能忘记初始化该变量。

+0

+1删除我的答案,因为它是一个重复的(你的答案比我的更好) – zebrabox 2010-02-13 15:30:18