Wie ein Vektor von LPD3DXSPRITE Objekten speichern?
Frage
Lassen Sie uns sagen, dass ich einen Vektor von LPD3DXSPRITE Objekte gespeichert werden sollen. Die Zeile Code zu erklären, würde std::vector<LPD3DXSPRITE> sprites;
ich meine Sprite zu schaffen, mit der Lage sein:
LPD3DXSPRITE sprite = NULL;
D3DXCreateSprite(myRenderingDevice, &sprite);
Schließlich soll ich in der Lage sein, dies wie so zum Vektor hinzuzufügen:
sprites.push_back(sprite);
Zumindest mit meinem Verständnis, das sollte plausibel sein. Allerdings stellt dies aber gibt Fehler Laufzeit. Warum ist das? Werde ich es falsch? Wie könnte ich es beheben?
Bearbeiten
Dies kann auch hilfreich sein. Die Call-Stack-Ausbeuten für diese Funktion, die vector<ID3DXSprite *, std::allocator<ID3DXSprite *>>::push_back(ID3DXSprite * const &_Val=0x0036fd38
ist, was genannt wird. Dies ist nicht der Vektor, der es übergeben wurde.
Allerdings LPD3DXSPRITE ist nur ein typedef für ID3DXSprite *. Könnte dies alles ans Licht bringen?
Lösung
Nach dem durch den Code suchen, fand ich das Problem. Etwas zu sehen, wenn Sie irgendwelche Brüche in Ihrer Anwendung ist die „Autos“ Tab oder die Locals Registerkarte. Hier finden Sie etwas über die this
Zeiger feststellen: es ist null
Das bedeutet, dass die Instanz, dass AddSprite
auf existiert nicht genannt wird. Das ist Ihre SpriteManager
, die ich sehe, ein Singleton ist. In Ihrem Haupt, die Sie nicht eine Instanz davon erstellen.
Ich hatte ein paar Dinge zu tun, es zum Laufen zu bringen. Ich enthalten "LudoRenderer/SpriteManager.h"
in Main.cpp
, und fügte den CreateInstance
Aufruf:
SpriteManager::CreateInstance();
Das einzige Problem dabei war, dass Sie Ihren Konstruktor / Destruktor privat erklärt hatte, wie andere Singletons, aber nie definiert, so habe ich das auch:
SpriteManager::SpriteManager(){}
SpriteManager::~SpriteManager(){}
Nach diesen Änderungen, es „gearbeitet“. Das ist in Anführungszeichen, weil Ihr Problem gelöst ist, aber es ist ein weiterer Fehler später im Code m_GameManager->SetWagon(m_Wagon);
.
Hier m_GameManager
ist nicht initialisiert. Ich unkommentiert m_GameManager = GameManager::GetInstance();
auf Linie 43 in LudoEngine.cpp
, die uns nach wie vor in dem gleichen Problem stellen, wird kein CreateInstance
jemals genannt. Ich habe den notwendigen Header in Haupt, die so genannte Methode erstellen. Dies das Problem behoben, und Ihr Motor lief (coole Demo, auch!)
Es gab einen Absturz bei der Ausfahrt, in ErrorLogger::LogError
, weil ErrorLogger
null war. Es wurde in LudoMemory
Destruktor aufgerufen wird, aber ich werde diese für Sie verlassen. :)
Nun, zwei Spitzen tihnk ich das helfen würde. Die erste ist über das Problem wir zu lösen. Normalerweise werden Singletons selbst erstellen, wenn sie es nicht schon sind. Ich würde Ihre Singleton GetInstance
zu so etwas wie dies ändern:
static T *GetInstance ( )
{
if (!m_Singleton) // or == NULL or whatever you prefer
{
CreateInstance();
}
return m_Singleton; // not sure what the cast was for
}
Dies wird die Schaffung des Singletons erzwingen, wenn es schon nicht gewesen ist. Nun, wenn Sie möchten, dass Benutzer CreateInstance
aufrufen, bevor zu GetInstance
versuchen, Sie könnten eine Art Warnung hinzu:
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;
}
Da das lässt sich die wichtigen Informationen „die Singleton?“, Sie immer Typeinfo, um es hinzuzufügen könnten versuchen:
#include <typeinfo>
// ...
std::cerr << "Warning, late creation of singleton: "
<< typeid(T).name() << std::endl;
Um zu versuchen, einige Typnamen in dorthin zu gelangen.
Und schließlich ist es in Ordnung zu delete 0
, wird Ihr aufgegebenes löschen Makro nicht erforderlich.
Um zu klären, haben Sie LUDO_SAFE_DELETE
, die überprüft, ob es nicht null ist, bevor sie gelöscht werden aufruft. In C ++, null Löschen hat keine Wirkung, so dass Ihr Scheck nicht benötigt wird. Alle Instanzen Ihrer schreddern konnte nur mit Ihrem LUDO_DELETE ersetzt werden.
Andere Tipps
Der Code sieht für mich ok. Aber Sie speichern einen Zeiger in dem Vektor ID3DXSprite. Wie wird diese de-zugewiesen? Ist es möglich, die Sprite-de-zugewiesen wurde so der Vektor einen ungültigen Zeigerhalt endet und dann versucht, den Zeiger zu verweisen?