Domanda

Diciamo che voglio memorizzare un vettore di oggetti LPD3DXSPRITE. La riga per dichiarare questo codice sarebbe std::vector<LPD3DXSPRITE> sprites; Dovrei essere in grado di creare il mio sprite con:

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

Infine, dovrei essere in grado di aggiungere questo al vettore in questo modo:

sprites.push_back(sprite);

Almeno con la mia comprensione, dovrebbe essere plausibile. Tuttavia, questo compila ma dà errori di runtime. Perchè è questo? Sto sbagliando? Come potrei risolverlo?

modifica

Anche questo può essere utile. Lo stack di chiamate produce per questa funzione che vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38 è ciò che viene chiamato. Questo non è il vettore che è stato passato.
Tuttavia, LPD3DXSPRITE è solo un typedef per ID3DXSprite *. Questo potrebbe portare alla luce qualcosa?

È stato utile?

Soluzione

Dopo aver esaminato il codice, ho riscontrato il problema. Qualcosa da guardare quando si verificano interruzioni nella propria applicazione è il & Quot; Autos & Quot; scheda o la scheda Locali. Qui noterai qualcosa sul puntatore this: è nullo!

Ciò significa che l'istanza su cui viene chiamato AddSprite non esiste. Questo è il tuo SpriteManager, che vedo è un singleton. Nella tua principale, non ne crei un'istanza.

Ho dovuto fare un paio di cose per farlo funzionare. Ho incluso "LudoRenderer/SpriteManager.h" in Main.cpp e ho aggiunto la CreateInstance chiamata:

SpriteManager::CreateInstance();

L'unico problema era che avevi dichiarato il tuo costruttore / distruttore privato, come altri singoli, ma non li hai mai definiti, quindi l'ho fatto anch'io:

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

Dopo queste modifiche, " ha funzionato " ;. Questo è tra virgolette perché il problema è stato risolto, ma c'è un altro errore più avanti nel codice m_GameManager->SetWagon(m_Wagon);.

Qui, m_GameManager non è inizializzato. Ho decommentato m_GameManager = GameManager::GetInstance(); sulla riga 43 in LudoEngine.cpp, il che ci pone nello stesso problema di prima, non viene mai chiamato ErrorLogger::LogError. Ho aggiunto l'intestazione necessaria in main, chiamato metodo di creazione. Questo risolto il problema e il tuo motore funzionava (anche una bella demo!)

Si è verificato un arresto anomalo all'uscita, in ErrorLogger, poiché LudoMemory era null. Era stato chiamato nel distruttore di GetInstance, ma lo lascerò per te. :)

Ora, due consigli che ti potrebbero aiutare. Il primo riguarda il problema che stiamo risolvendo. Normalmente, i singoli saranno creati se non lo sono già. Vorrei cambiare il tuo singleton delete 0 in qualcosa del genere:

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

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

Questo forzerà la creazione del singleton se non lo è già stato. Ora, se desideri che gli utenti chiamino LUDO_SAFE_DELETE prima di provare a <=>, puoi aggiungere una sorta di avviso:

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;
}

Dal momento che tralascia le informazioni importanti " quale singleton? " ;, puoi sempre provare ad aggiungere typeinfo ad esso:

#include <typeinfo>

// ...

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

Per provare a inserire alcuni nomi di tipi lì.

E infine, va bene <=>, la tua macro di eliminazione selezionata non è necessaria.

Per chiarire, hai <=>, che controlla se non è null prima di chiamare delete. In C ++, l'eliminazione di null non ha alcun effetto, quindi il tuo controllo non è necessario. Tutte le istanze della tua eliminazione sicura potrebbero essere sostituite solo con il tuo LUDO_DELETE.

Altri suggerimenti

Il codice mi sembra ok. Ma stai memorizzando un puntatore a ID3DXSprite nel vettore. Come viene disallocato? È possibile che lo sprite sia stato disallocato in modo che il vettore finisca con un puntatore non valido e quindi tenti di fare riferimento al puntatore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top