문제

lpd3dxsprite 객체의 벡터를 저장하고 싶다고 가정 해 봅시다. 이 코드를 선언하는 줄은 일 것입니다 std::vector<LPD3DXSPRITE> sprites; 다음과 같이 스프라이트를 만들 수 있어야합니다.

LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);

마지막으로 이것을 벡터에 추가 할 수 있어야합니다.

sprites.push_back(sprite);

적어도 내 이해와 함께, 그것은 그럴듯해야합니다. 그러나 이것은 컴파일하지만 런타임 오류가 제공됩니다. 왜 이런거야? 내가 잘못하고 있는가? 어떻게 고칠 수 있습니까?

편집하다:

이것은 또한 도움이 될 수 있습니다. 통화 스택은이 기능에 대한 생산됩니다 vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38 불리는 것입니다. 이것은 통과 된 벡터가 아닙니다.
그러나 lpd3dxsprite는 id3dxsprite *의 typedef 일뿐입니다. 이것이 무엇이든 빛을 가져올 수 있습니까?

도움이 되었습니까?

해결책

코드를 살펴본 후 문제를 발견했습니다. 응용 프로그램에서 휴식을 취할 때 볼 내용은 "Autos"탭 또는 현지인 탭입니다. 여기에 당신은 this 포인터 : NULL입니다!

그것은 인스턴스를 의미합니다 AddSprite 호출되는 것은 존재하지 않습니다. 이건 너의 SpriteManager, 내가 보는 것은 싱글 톤입니다. 당신의 메인에서는 인스턴스를 만들지 않습니다.

나는 그것을 작동시키기 위해 몇 가지 일을해야했다. 나는 포함했다 "LudoRenderer/SpriteManager.h" 안에 Main.cpp, 그리고 추가 CreateInstance 전화:

SpriteManager::CreateInstance();

이것의 유일한 문제는 당신이 다른 싱글 톤과 마찬가지로 당신의 생성자/소멸자 개인을 선언했지만 결코 정의하지 않았다는 것입니다.

SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){} 

이러한 변경 후에는 "작동했습니다". 문제가 해결 되었기 때문에 인용문이지만 코드의 뒷부분에 또 다른 오류가 있습니다. m_GameManager->SetWagon(m_Wagon);.

여기, m_GameManager 초기화되지 않았습니다. 나는 무책임합니다 m_GameManager = GameManager::GetInstance(); 43 라인에 LudoEngine.cpp, 우리를 이전과 같은 문제에 넣었는데, CreateInstance 항상 호출됩니다. Main에 필요한 헤더를 만들었습니다. 이것은 문제가 해결되었고 엔진이 실행되었습니다 (멋진 데모도!)

출구에 충돌이 발생했습니다 ErrorLogger::LogError, 왜냐하면 ErrorLogger null이었다. 그것은 호출되었습니다 LudoMemory의 파괴자이지만 이거 맡길 게요. :)

이제 도움이 될 두 가지 팁입니다. 첫 번째는 우리가 해결하는 문제에 관한 것입니다. 일반적으로 싱글 톤은 아직 없다면 스스로를 만들 것입니다. 나는 당신의 싱글 톤을 바꿀 것입니다 GetInstance 다음과 같은 것 :

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
    }

    return m_Singleton; // not sure what the cast was for
}

이로 인해 싱글 톤이 아직 없었다면 싱글 톤의 창조를 강요 할 것입니다. 이제 사용자에게 전화를 원한다면 CreateInstance 시도하기 전에 GetInstance, 당신은 일종의 경고를 추가 할 수 있습니다.

static T *GetInstance ( )
{
    if (!m_Singleton) // or == NULL or whatever you prefer
    {
        CreateInstance();
        std::cerr << "Warning, late creation of singleton!" << std::endl;

        // or perhaps:
        ErrorLogger::GetInstance()->
                        LogError(L"Warning, late creation of singleton!");
    }

    return m_Singleton;
}

그것은 "어떤 싱글 톤?"중요한 정보를 제거하기 때문에 항상 typeinfo를 추가하려고 시도 할 수 있습니다.

#include <typeinfo>

// ...

std::cerr << "Warning, late creation of singleton: "
          << typeid(T).name() << std::endl;

거기에 유형 이름을 얻으려고 노력합니다.

그리고 마지막으로, 괜찮습니다 delete 0, 확인 된 삭제 매크로가 필요하지 않습니다.

명확히하기 위해, 당신은 가지고 있습니다 LUDO_SAFE_DELETE, 삭제 호출하기 전에 널이 아닌지 확인합니다. C ++에서는 NULL 삭제에 영향을 미치지 않으므로 수표가 필요하지 않습니다. 안전 삭제의 모든 인스턴스는 Ludo_delete로만 대체 될 수 있습니다.

다른 팁

코드는 나에게 괜찮아 보인다. 그러나 벡터에 ID3DXSprite에 대한 포인터를 저장하고 있습니다. 이것은 어떻게 할당되지 않습니까? 벡터가 유효하지 않은 포인터를 잡고 포인터를 참조하려고 시도하여 스프라이트가 분리 될 가능성이 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top