2011-12-13 4 views
1

현재 DirectX를 사용하는 C++ 게임을 작업 중입니다. 엔진은 우리 학교의 교수가 우리에게주었습니다. 저는 엔진에서 메모리 누출을 검사했으며, 나는이 방법으로 그 엔진을 추적했다고 생각합니다. 시작하려면, 호출되지도 않았고 이제는 DirectX에서로드 된 텍스처를 완전히 삭제하고 정리하는 올바른 방법인지 불확실합니다. 여기 C++에서 DirectX 텍스처 정리

이 방법은 TextureManager에 호출되고 : 텍스처 부분 모두에 대해서

void DirectXTextureManager::clear() 
{ 
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator it; 
    map<wchar_t*, LPDIRECT3DTEXTURE9>::iterator itToErase; 
    it = textures->begin(); 
    while (it != textures->end()) 
    { 
    wchar_t *keyToDelete = (*it).first; 
    LPDIRECT3DTEXTURE9 textureToDelete = (*it).second; 
    itToErase = it; 
    it++; 
    textures->erase(itToErase); 
    delete keyToDelete; 
    textureToDelete->Release(); 
    textureToDelete = NULL; 
    } 

    stringTable->emptyStringTable(); 
} 

답변

1

잘 보인다 - 그것을 확보하기 위해 LPDIRECT3DTEXTURE 객체에 Release()를 호출한다 :

LPDIRECT3DTEXTURE9 textureToDelete = (*it).second; 
... 
textureToDelete->Release(); 

나는 약간 걱정이된다 stringTable - 그것은지도 열쇠에 wchar_t*를 책임지는 부분이다? 그렇다면 stringTable->emptyStringTable()이 무엇인지 확인해야합니다. 수동으로 키를 삭제할 필요가 없을 수도 있습니다.

+0

나는 아마도 그것도 emptyStringTable()에 대한 호출과 관련이 있다고 생각한다. – twsaef

0

DirectXTextureManager에는 어떤 텍스처에도 Release()을 호출하는 다른 방법이 있습니까?

만약 그렇다면 clear()으로 전화 할 필요가 없습니다. 특히 클래스 소멸자 또는 이미 정리를 수행 할 수있는 다른 "UniInitialize()"메소드가 있는지 확인하십시오. 개인적으로는 포인터가 null이 아니 었는지 확인한 후 Release를 호출하고 이후에 NULL로 설정하기 때문에 DXUT 헤더의 SAFE_RELEASE() 매크로를 사용하는 것을 선호합니다.

마지막으로 "DirectX 제어판"(SDK와 함께 설치됨)에서 제어되는 DirectX 디버그 런타임의 출력으로 디버깅이 더 쉬울 수도 있습니다. VisualStudio 출력 창에 코드를 해결하는 데 사용할 수있는 종료되지 않은 리소스의 세부 정보를 포함하여 매우 우수한 로깅을 출력합니다.