2009-03-03 7 views
1

Ich versuche, ein std :: vector <> :: const_iterator zu verwenden, und ich bekomme einen Absturz "Zugriffsverletzung". Es scheint, dass der std :: vector Code abstürzt, wenn er seine eigenen internen First_ und Last_ Zeiger verwendet. Vermutlich ist dies ein bekannter Fehler. Ich hoffe, dass jemand mich auf die richtige Problemumgehung hinweisen kann. Es ist wahrscheinlich relevant, dass die Absturzfunktion von einer externen Bibliothek aufgerufen wird?VC++ 6.0-Vektorzugriffsverletzung Absturz. Bekannter Fehler?

const Thing const* AClass::findThing (const std::string& label) const 
{ 
    //ThingList_.begin() blows up at run time. Compiles fine. 
    for (std::vector<Thing*>::const_iterator it = ThingList_.begin(); it != ThingList_.end(); ++it) { 
     //Irrelevant. 
    } 
    return 0; 
} 

Ruft einfach ThingList_.size() stürzt auch ab.

Dies ist sp6, wenn es darauf ankommt.

+0

Wohin weisen Sie ThingList_ zu? – jdigital

+0

Vielleicht eine dunb Frage, aber was ist ThingList_? – John

+0

ThingList_ ist in einem eigenen Konstruktor zugeordnet. Es ist ein Vektor. Es lebt als ein privates Mitglied von AClass. ThingList_ ist ein Vektor von Objektzeigern, wie die Iterator-Deklaration zeigt. – kingkongrevenge

Antwort

4

Wenn Sie C++ - Objekte an externe Bibliotheksgrenzen übergeben, müssen Sie sicherstellen, dass alle Bibliotheken die gleiche Laufzeitbibliothek verwenden (insbesondere den gleichen Heap-Allokator). In der Praxis bedeutet dies, dass alle Bibliotheken mit der DLL-Version von MSVCRT verknüpft sein müssen.

+0

Wir hatten das gleiche Problem mit Vektoren zurück in den Tag. Sie über DLL-Grenzen hinweg zu übergeben, verursachte Kopfschmerzen, sogar mit den gleichen CRT-Bibliotheken. Ich glaube, dass sie das in späteren Versionen behoben haben. Wir hatten seit Jahren keine ähnlichen Probleme. – Joe

1

Es ist fast sicher ein Fehler in Ihrem Code und nicht std :: vector. Dieser Code wird von zu vielen Projekten benutzt, um einen solchen Repro-Bug zu haben.

Was wahrscheinlich passiert ist, dass die Variable ThnigList_ in irgendeiner Weise beschädigt wurde. Wurde das zugrunde liegende Array direkt angesprochen und/oder verändert?

+0

Die Google sagt, es gibt Tonnen von schrecklichen Bugs in dieser STL-Implementierung. Denken Sie daran, VC6 ist alt. Ich werde den Steuerelementfluss, der mit ThingList_ arbeitet, genauer untersuchen, aber es ist eine ziemlich direkte private Membervariable. Momentan sehe ich keine Abdrücke oder Hinweise darauf. – kingkongrevenge

+0

@kingkongrevenge, ja, es gibt Fehler, aber nicht in der Lage, einen einfachen Vektor zu iterieren wäre ein Schiffsstopper gewesen – JaredPar

+0

Einer der Fehler, die ich sah, war, dass Sie einfach nicht eine std :: map über gemeinsame Bibliotheken verwenden können. Ich hätte das für einen Schiffsstopper gehalten, aber anscheinend haben sie es nicht verstanden. Ich denke, das ist ein Fehler und hängt damit zusammen, wie mein Projekt verknüpft ist. – kingkongrevenge

0

Ich stimme Jared zu, dass es wahrscheinlich in Ihrem Code ist, dennoch sollten Sie sicher sein, dass Ihre STL-Bibliotheken auf dem neuesten Stand sind.

Die dinkumware Website enthält die gepatchten Dateien, die Sie benötigen.

Sie sollten nur aktualisieren, um sicher zu sein

+0

Wenn der Vektor niemals geworfen wird, was könnte sonst noch verderblich sein? Sobald ich überprüfe, dass AClass und der Vektor nie falsch geworfen werden, habe ich keine Ideen mehr. Und ich bin mir ziemlich sicher, dass sie nicht besetzt sind. – kingkongrevenge

+0

Ich spreche nicht über Besetzung Beziehung Korruption.Ich weise darauf hin, dass Ihre #include Datei möglicherweise veraltet ist und Sie den Link zu dem Ort angeben, an dem die Aktualisierungen gefunden werden können. :) – EvilTeach

+0

Ohne auf Ihren Code zu schauen, konnte ich nicht anfangen zu erraten. C und C++ sind gut für Randbedingte Defekte bekannt. – EvilTeach