我最近芬兰推出了一款简单的2D游戏引擎。在我的项目的sprite模块中,有一个关于
的例外“AI.exe中0x00CE4A75处的未处理异常:0xC0000005:访问 违规读取位置0xCCCCCCCC。“
我不知道是什么导致它,因为一切都是初始化和解除分配相同。这种异常似乎发生在 if(m_inputLayout)m_inputLayout-> Release()中。其他一切都很好。代码就在下面。
CAIGESprite::~CAIGESprite(void)
{
if( m_mvpCB ) m_mvpCB->Release();
if( m_alphaBlendState ) m_alphaBlendState->Release();
if( m_colorMapSampler ) m_colorMapSampler->Release();
if( m_colorMap ) m_colorMap->Release();
if( m_vertexBuffer ) m_vertexBuffer->Release();
if( m_inputLayout ) m_inputLayout->Release();
if( m_solidColorPS ) m_solidColorPS->Release();
if( m_solidColorVS ) m_solidColorVS->Release();
if( m_textureFile ) delete m_textureFile;
if( m_shaderFile ) delete m_shaderFile;
m_shaderFile = nullptr;
m_textureFile = nullptr;
m_solidColorVS = NULL;
m_solidColorPS = NULL;
m_inputLayout = NULL;
m_vertexBuffer = NULL;
m_colorMap = NULL;
m_colorMapSampler = NULL;
m_alphaBlendState = NULL;
m_mvpCB = NULL;
}
我还检查了每个内容并且它们都是空的无法读取内存,那么为什么m_inputLayout会不同并导致执行?可能的原因是什么?
如果请求,我会发布更多代码。
答案 0 :(得分:1)
请记住,“if”运算符仅测试布尔条件。虽然通常在不指定“!= 0”的情况下直接使用“if”进行空值检查,但它会将指针隐式转换为布尔值。如果指针为0,则该值为false,如果该值为零,则该值为true。即使变量尚未初始化,内存位置也可以保存任何垃圾值,但在调试模式下,通常会得到一个0xCCCCCCCC或一些其他已知常量来帮助您找出问题所在。因此,在我看来,您的变量尚未初始化。如果单步执行代码,您应该看到它的值为“0xCCCCCCCC”。通过命名变量,我假设它是一个成员变量,所以最好将它在它所属的类的初始化列表中设置为NULL。
答案 1 :(得分:0)
构造函数中“m_inputLayout”是否正确初始化为null?您可能正在尝试删除尚未创建的无效指针。