2013-06-29 2 views
0

최근에 간단히 2 차원 게임 엔진을 사용했습니다. 내 프로젝트의 스프라이트 모듈에서, exeption에 대한DirectX 11 메모리 할당 해제 오류

있다 "가 0xc0000005 : 처리되지 않은 AI.exe에서 0x00CE4A75에서 예외입니다. 액세스 위반 읽기 위치 0xCCCCCCCC는"

모든 것이 초기화되고 할당 해제되므로 무엇이 원인인지 알 수 없습니다. 그리고이 예외는 (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이 다를 수와 exeption을 일으킬 것인가? 가능한 이유는 무엇입니까?

요청하면 더 많은 코드를 게시 할 예정입니다.

+2

0xcccccccc는 디버그 모드에서 코드를 실행할 때 MSVC가 "초기화되지 않은 변수"를 설정하는 값입니다. 내 생각 엔 포인터 필드 중 하나가 NULL로 설정되지 않았고 올바른 포인터로 초기화되지 않았기 때문에 포인터를 설정하지 않았으므로 "0xccccccccc"입니다. –

+0

고마워요. 두 생성자가 있기 때문에 다른 생성자가 특정 값을 초기화하는 것을 잊어서 예외가 발생한다는 사실을 알지 못했습니다. 다시 한번 감사드립니다. –

답변

1

"if"연산자는 부울 조건 만 테스트합니다. "! = 0"을 지정하지 않고 직접 null 검사에 "if"를 사용하는 것이 일반적이지만 포인터를 부울로 암시 적으로 캐스트합니다. 포인터가 0이면 값은 false이고 0 이외의 값이면 true입니다. 변수가 초기화되지 않은 경우에도 메모리 위치는 가비지 값을 유지할 수 있지만 디버그 모드에서는 일반적으로 0xCCCCCCCC 또는 다른 알려진 상수를 사용하여 문제의 원인을 파악할 수 있습니다. 따라서 내 생각에 변수가 초기화되지 않았습니다. 코드를 단계별로 실행하면 그 값은 "0xCCCCCCCC"입니다. 변수의 이름을 지정하면 멤버 변수라고 가정하므로 클래스가 속한 클래스의 이니셜 라이저 목록에서 NULL로 설정하는 것이 좋습니다.

0

"m_inputLayout"이 생성자에서 null로 제대로 초기화 되었습니까? 작성되지 않은 유효하지 않은 포인터를 h 제하려고 시도했을 수 있습니다.