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?

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top