DirectX 11内存释放错误

时间:2013-06-29 19:59:18

标签: c++ memory-management memory-leaks directx-11

我最近芬兰推出了一款简单的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会不同并导致执行?可能的原因是什么?

如果请求,我会发布更多代码。

2 个答案:

答案 0 :(得分:1)

请记住,“if”运算符仅测试布尔条件。虽然通常在不指定“!= 0”的情况下直接使用“if”进行空值检查,但它会将指针隐式转换为布尔值。如果指针为0,则该值为false,如果该值为零,则该值为true。即使变量尚未初始化,内存位置也可以保存任何垃圾值,但在调试模式下,通常会得到一个0xCCCCCCCC或一些其他已知常量来帮助您找出问题所在。因此,在我看来,您的变量尚未初始化。如果单步执行代码,您应该看到它的值为“0xCCCCCCCC”。通过命名变量,我假设它是一个成员变量,所以最好将它在它所属的类的初始化列表中设置为NULL。

答案 1 :(得分:0)

构造函数中“m_inputLayout”是否正确初始化为null?您可能正在尝试删除尚未创建的无效指针。