Come archiviare un vettore di oggetti LPD3DXSPRITE?
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?
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?