2011-01-16 18 views
0

Ich habe ein Singleton, das ist ein Image-Manager. Wenn ich versuche, ein Bild zu laden, nenne ich Singleton auf diese Weise:Muss std :: map initialisiert werden?

utils::CImageBuff* img4 = utils::CImageManager::getInstance()->loadFromFile("uswg.png"); 

Und in Methode Loadfromfile, speichere ich das Bild in eine Karte:

m_imageMap[imageHashID].setHeight(ilGetInteger(IL_IMAGE_HEIGHT)); 
m_imageMap[imageHashID].setWitdh(ilGetInteger(IL_IMAGE_WIDTH)); 
m_imageMap[imageHashID].setBpp(ilGetInteger(IL_IMAGE_BPP)); 
.... 

Das Problem ist, dass ich eine bekommen Speicherzugriffsfehler Ist wie wenn m_imageMap NULL ist o falsch initialisiert, weil im ersten Satz excepttion geworfen wird. Aber wie gesagt, ist ein Singleton also muss die Map initialisiert werden. Ich entwickle in VC++ 2008. Es könnte eine falsche Kompilierung/.obj Datei sein?

Dies funktioniert gut gestern

Einige Ratschläge?

Edit: Die Erklärung von m_imageMap ist sehr einfach:

typedef std::map<unsigned int,utils::CImageBuff> t_imageMap; 

Als zusätzliche Information, die Ausnahme in der Zeile 1643 der Datei output.c erzeugt wird.

Bearbeiten Nun, ich bin sehr enttäuscht mit diesem Fall. Ich habe den Code geändert, also ist die Klasse jetzt kein Singleton mehr. Jetzt ist nur m_imageMap statisch, um alle geladenen Bilder von jedem Ort aus sichtbar zu machen. Scheitert aber immer noch auf die gleiche Weise. Der Fehler ist eine Zugriffsverletzung. Außerdem, wenn ich den gesamten Methodencode um diesen Code ändere:

schlägt immer noch fehl. Es ist so, als wäre die Karte in irgendeiner Weise leer oder gesperrt oder sogar schlecht initialisiert, aber ich weiß es nicht. Kannst du mir helfen?

Wenn Sie etwas mehr Code benötigen, werde ich einfügen, aber mit diesen drei Zeilen abstürzt vereinfacht das Problem, denke ich.

Edit: Endlich gelöst Endlich habe ich von

geändert
std::map<unsigned int,utils::CImageBuff> 

zu

std::map<unsigned int,utils::CImageBuff*> 

Und jetzt funktioniert es. Jetzt muss ich einfach eine Methode zum Löschen des Inhalts einer statischen std :: map von Zeigern denken.

Vielen Dank an alle

+0

Wie wird 'm_imageMap' deklariert? –

+3

Bitte zeigen Sie die Definition von 'm_imageMap'. Beachten Sie, dass eine 'std :: map' nicht' NULL' sein kann; das macht keinen Sinn. –

+1

Welcher Typ ist m_imageMap? Wie sieht der Rest der loadFromFile-Funktion aus? – SoapBox

Antwort

3

Ich nehme an, dass m_imageMap eine reguläre Membervariable einer Klasse ist und Sie dies von einer Memberfunktion dieser Klasse aufrufen.

Wenn das der Fall ist, dann rufen Sie wahrscheinlich diese Elementfunktion auf einem Zombie auf, Null andernfalls ungültiger Zeiger.Ist die Codezeile mit m_imageMap die erste Verwendung einer Membervariablen in dieser Funktion? Das ist ein ziemlich gewöhnliches Werbegeschenk.

Die einfache Möglichkeit, dieses Problem zu debuggen, ist es im Debugger zu sehen. Solange dieser Fehler in einem Debug-Build auftritt, wird VC++ die Zugriffsverletzungsausnahme glücklich abfangen und sofort in diesem Moment brechen. Sehen Sie sich den Wert des "this" -Zeigers im Beobachtungsfenster für lokale Variablen an. Ist es null oder 0xcdcdcdcd?

+0

Ich bin nicht vollständig unter Ihre Antwort. Tatsächlich ist m_imageMap ein reguläres Mitglied der Klasse und ich rufe dieses Mitglied von einer Mitgliedsfunktion dieser Klasse auf. Aber die Frage ist, wie man diesen Zombie fängt und ein Singleton ist, wie man den Code findet, der diesen Zombie provoziert. m_imageMap ist nicht genau null. Ihr Wert ist einfach (gemäß Inspection im Debug-Modus) [0](), ändert sich aber zu keinem Zeitpunkt. AFAIK, Sie müssen einfach ein Element einfügen, um dieses Element zu konstruieren .... – Killrazor

+0

Was ich versuche zu sagen ist, dass es wahrscheinlich nichts falsch mit m_imageMap selbst ist (obwohl es seltsam scheint, dass Sie Zeiger von CImageBuff von Ihrem Singleton bekommen loader, aber Kopien von CImageBuff in der Map speichern und nicht nur den Zeiger auf das Original, Ihr Problem könnte auch darin liegen), Ihr Problem liegt wahrscheinlich bei der Klasse, die m_imageMap besitzt. Wie erstellt man es und referenziert es? Wenn Sie "ImageMapOwnerClass * owner = null; owner-> AddSomethingToImageMap(); 'würde genau wie beschrieben abstürzen (wenn Ihr Beispielcode in dieser Funktion ist). – Alan

2

std :: map erfordert nicht initialization- andere als die durch den entsprechenden Konstruktor zur Verfügung gestellt. Solange Sie einen Konstruktor aufgerufen haben (der Standard ist auch in Ordnung), wird die Zuordnung ordnungsgemäß initialisiert. Der Singleton ist ein wirklich schreckliches Muster mit vielen schrecklichen Problemen, und Sie sollten solche Dämonen aus Ihrem Code herausnehmen, aber keiner von ihnen enthält das normalerweise. Sie müssen eine weitere Frage mit dem Singleton-Code eingeben, um Hilfe zum aktuellen Problem zu erhalten.

+0

+1 für Singleton ist ein schreckliches Design-Muster. –

Verwandte Themen