【发布时间】:2009-10-15 12:40:22
【问题描述】:
-- 首先,我不知道如果我在命名空间下声明它,而不是在类或函数中声明它是否可以称为“全局向量”。 --
我现在正在为我的游戏编写一个简单的 Irrlicht (http://irrlicht.sourceforge.net) 包装器,以使事情变得更简单、更容易,但最近在尝试 push_back 在全局范围内声明的向量时出现“访问冲突读取位置”错误.
到目前为止,这是我的代码:
irrwrap.cpp:
namespace irrw
{
//.........
IrrlichtDevice *device;
IVideoDriver *driver;
irr::core::array<irr::video::ITexture*> TextureCollector;
vector<int> TextureConnector;
//.........
}
//..............
void irrInit(int iGraphicsDriver, int iWindowWidth, int iWindowHeight, int iScreenDepth, bool bFullScreen)
{
E_DRIVER_TYPE drvT;
if(iGraphicsDriver == GD_SOFTWARE)
drvT = EDT_SOFTWARE;
else if(iGraphicsDriver == GD_D3D8)
drvT = EDT_DIRECT3D8;
else if(iGraphicsDriver == GD_D3D9)
drvT = EDT_DIRECT3D9;
else if(iGraphicsDriver == GD_OPENGL)
drvT = EDT_OPENGL;
//..............
irrw::device = createDevice(drvT, dimension2d<u32>(iWindowWidth, iWindowHeight), iScreenDepth, bFullScreen);
irrw::driver = irrw::device->getVideoDriver();
//..................
}
void irrLoadImage(irr::core::stringc szFileName, int iID, int iTextureFlag)
{
//........
irrw::TextureCollector.push_back(irrw::driver->getTexture(szFileName)); // the call stack pointed to this line
irrw::TextureConnector.push_back(iID);
}
main.cpp:
//.........
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
{
//.........
irrInit(GD_OPENGL, 800, 600, 16, false);
irrLoadImage("picture.jpg", 100, 1);
//.........
}
和错误:
Game.exe 中 0x692804d6 处未处理的异常:0xC0000005:访问冲突读取位置 0x00000558。
现在我真的不知道如何解决这个问题。
任何形式的帮助将不胜感激:)
以下是一些原型:
virtual ITexture* getTexture(const io::path& filename) = 0;
typedef core::string<fschar_t> path; // under 'io' namespace
typedef char fschar_t;
typedef string<c8> stringc;
typedef char c8;
仅供参考,我使用的是 MSVC++ 2008 EE。
(代码已更新)
【问题讨论】:
-
irrw::driver->getTexture(szFileName) 是否有可能生成 AV 而不是 push_back? “读取位置 0x00000558”看起来可能是在追逐一个 NULL 指针; irrw::driver 初始化了吗?
-
是的。我编辑了我的帖子并添加了一些额外的代码行以显示 irrw::driver 已经初始化。你说的这个“AV”是怎么回事?
-
这有什么更新吗?真正的原因是什么?