gpt4 book ai didi

c++ - 访问全局 vector 时出现 "Access violation reading location"

转载 作者:行者123 更新时间:2023-11-28 01:12:42 25 4
gpt4 key购买 nike

-- 首先,我不知道如果我在命名空间下而不是在类或函数中声明该 vector 是否可以称为“全局 vector ”。 --

我现在正在为我的游戏编写一个简单的 Irrlicht ( http://irrlicht.sourceforge.net ) 包装器,以使事情变得更简单、更容易,但最近我在尝试 push_back 全局范围内声明的 vector 时遇到“访问冲突读取位置”错误.

到目前为止,这是我的代码:

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);
}

主要.cpp:

//.........
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
{
//.........
irrInit(GD_OPENGL, 800, 600, 16, false);
irrLoadImage("picture.jpg", 100, 1);
//.........
}

和错误:

Unhandled exception at 0x692804d6 in Game.exe: 0xC0000005: Access violation reading location 0x00000558.

Now I really got no idea on how to fix the problem.

Any kind of help would be appreciated :)

Here are some prototypes:

    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。

(代码已更新)

最佳答案

调用堆栈指向一个做了很多事情的行。我建议查看以下检查列表来查找问题:

  1. irrw::driver 是否指向正确的对象,或者它可能是空指针/未初始化指针?
  2. irrw::driver->getTexture(..) 采用什么类型的参数?它真的是 irr::core::stringc 还是其他东西(也许是普通的 C 字符串?)。
  3. “szFileName”的值是多少;你能打印它吗(即用 printf 之类的)?也许它已损坏,因为 irr:core::stringc 类做了一些有趣的事情。
  4. irrw::driver->getTexture(..) 的返回类型是什么——它真的返回 irr::video::ITexture* 还是可能返回其他东西(某种指针包装器)?
  5. irrw::driver->getTexture(szFileName) 的返回值是多少;称呼?质地合适吗?

更新:现在您的问题已更新,这是可能发生的新想法:

您的代码的简化版本是这样的:

E_DRIVER_TYPE drvT;
if(iGraphicsDriver == foo) // iGraphicsDriver is an int
drvT = abc;
else if(iGraphicsDriver == bar)
drvT = xyz;
// ... and so on ...

irrw::device = createDevice(drvT, ... );
irrw::driver = irrw::device->getVideoDriver();

如果 iGraphicsDriver 具有未检查的值,drvT 可能会保持未初始化状态。在这种情况下,createDevice() 调用可能会返回一个无效的设备,而这又会在调用 getVideoDriver() 时返回一个无效的视频驱动程序。

我建议你将 drvT 初始化为一些合理的东西,比如:

E_DRIVER_TYPE drvT = EDT_SOFTWARE;

这样可以避免这个问题。

FWIW,这个错误在过去可能没有被注意到,因为 EDT_SOFTWARE 可能是 0 的 #define。在调试版本中,'drvT' 可能会自动初始化为 0,因此您只在发布版本中注意到这一点。只是一个疯狂的想法。

关于c++ - 访问全局 vector 时出现 "Access violation reading location",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1572113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com