这是用于仿真器的,但是现在我只是在加载ROM。我不明白为什么我的代码会给我一个break异常错误。在bufferGame函数之后,gameBuffer变量超出范围。我可以在该函数中调用gameBuffer [0]等,但是一旦我使另一个函数调用该数组,它就会给我:SNES Emulator.exe中0x0093303A的未处理异常:0xC0000005:访问冲突读取位置0x00000008。请帮忙!
标头:
class CGame
{
public:
CGame(char* passed_gamePath);
~CGame(void);
void loadGame(char* gamePath);
void closeGame();
BYTE* getBufferedFile();
int getGameSize(FILE* game);
void bufferGame(FILE* game);
void printHexBytes(int offset, int amount);
private:
int gameSize;
FILE* game;
BYTE* gameBuffer;
};
CPP文件:
构造函数:
CGame::CGame(char* passed_gamePath)
{
game = NULL;
gameSize = 0;
gameBuffer = NULL;
loadGame(passed_gamePath);
bufferGame(game);
}
加载游戏:
void CGame::loadGame(char* gamePath)
{
if ((fopen_s(&game, gamePath, "rb")) == 0)
{
std::cout << "File opened successfully!" << std::endl;
gameSize = getGameSize(game);
}
else
{
std::cout << "Could not open file." << std::endl;
}
}
bufferGame:
void CGame::bufferGame(FILE* game)
{
gameBuffer = new BYTE[gameSize];
if (fread_s(gameBuffer, gameSize, 1, gameSize, game) != 0)
{
std::cout << "Read file successfully!" << std::endl;
}
else
{
std::cout << "Error reading file." << std::endl;
}
}
*编辑:这是额外的代码,因为你们认为上述正确。
仿真器在main中实例化。构造函数实例化Game的实例。然后调用printHexBytes,这是我读取gameBuffer时出错的地方。 (顺便说一句,我已将game(变量)重命名为gameFile,以免引起混淆。)
仿真器构造函数:
CEmulator::CEmulator(void)
{
CGame* Game = new CGame("SuperMarioWorld.smc");
p_Register = 0x00;
}
主文件:
int main (void)
{
CEmulator* Emulator = new CEmulator();
Emulator->getGame()->printHexBytes(0x0FF, 9);
std::cin.get();
delete Emulator;
return 0;
}
打印十六进制字节(CGame的一部分):
void CGame::printHexBytes(int offset, int amount)
{
for (int i = offset; i < (offset + amount); i++)
{
printf("%X ", gameBuffer[0]);
}
}
最佳答案
您的问题出在CEmulator
构造函数中:
CGame* Game = new CGame("SuperMarioWorld.smc");
您正在创建一个新的
CGame
,将其存储在名为Game
的局部变量中,然后在函数返回时将其丢弃。也许您打算将其存储在其他地方?关于c++ - 为什么我的数组超出范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18838728/