std::map Access Violation



  • Hallo,

    nun habe ich wieder ein Problem bei welchem ich nicht weis ob dieses an meinem Programm oder an einem weitern Bug im XE2 liegt.

    Folgende Situation: Ich lesen aus meiner Datenbank werte aus und speichere diese in einer std::map um später schneller darauf zugreifen zu können, als wie wenn ich diese Werte zur Zeit jeweils einzeln immer aus der Datenbank hole.
    Das geschieht mit folgendem code:

    // die vorhandenen Workplaces Auslesen und Speichern
    	std::map<int, UnicodeString> Workplaces;
    	Query1->Active = false;
    	Query1->SQL->Text = "SELECT * FROM Workplaces WHERE idDivision=" + DivisionID;
    	try {
    		Query1->Active = true;
    		Query1->First();
    		while (!Query1->Eof) {
    			Workplaces[Query1->FieldByName("WorkplaceID")->AsInteger] = Query1->FieldByName("Name")->AsString;
    			Query1->Next();
    		}
    	}
    	__finally {
    		Query1->Active = false;
    		Query1->SQL->Text = "";
    	}
    

    soweit so gut. Das Programm funktioniert so wie gewollt, und an dieser Stelle auch um einiges zügiger als zuvor (mit AQTime gemessen).
    Wenn ich nun das Dialogfenster in welchem sich der Code befindet schließe, ist auch noch alles in Ordnung. Erst wenn ich das Programm an sich beende bekomme ich vom CodeGuard wieder eine 'Access Violation'. Der Dialog befindet sich in einer DLL welche dynamisch zur Laufzeit geladen wird. Diese Access Violation tritt auch schon dann auf wenn ich nur

    std::map<int, UnicodeString> Workplaces;
    

    im Code stehen habe, ohne die Map zu füllen, bzw. dann Werte daraus abzurufen.
    Wenn ich dieses std::map in einem Testprojekt direkt in der MainForm einsetze ist alles OK.
    Ist das nun wieder einer der schönen Fehler des CodeGuards im XE2? Diese 'Access Violation' tritt nur auf wenn ich im DebugMode mit aktivem CodeGuard compiliere.
    Im ReleaseMode ohne CodeGuard scheint alles in Ordnung.
    Ich habe auch schon einen Tread mit einem ähnlichen Fehler in Verbindung mit TStringGrid und der 'MouseCoord' Methode aufgemacht.

    Wäre schön wenn da jemand etwas wüsste.

    Gute Nacht und noch schönes Wochenende

    Netzschleicher



  • Keiner eine Info für mich?

    Grüße



  • Hat keiner eine Idee woran die Access Violation liegen könnte?

    Ich habe das Projekt nun in den C++Builder 2010 und auch noch in das RAD Studio 2007 zurückportiert, und immer taucht die Access Violation beim Beenden des Programmes auf.
    Also kann es ja nicht am XE2 liegen? Oder mache ich bei der Anwendung von std::map einen Fehler?

    Bitte um Hilfe.

    Grüße Netzschleicher



  • Netzschleicher schrieb:

    Bitte um Hilfe.

    Sieht nach einem CodeGuard-Bug aus, aber die Ferndiagnose ist da schwierig.

    Wenn du mir ein minimales Projekt zum Reproduzieren bereitstellst (möglichst C++Builder 2010 oder XE), kann ich mal näher hinschauen.



  • @ audacia

    Ich habe Dir ein Test-Projekt im C++Builder 2010 erstellt und an Deine eMail-Adresse geschickt. Vielen Dank schonmal im Voraus für Deine Mühen.

    Grüße Netzschleicher



  • Ich hab reingeschaut und sehe eigentlich keine Alternative zu einem CodeGuard-Bug. Da cg32.dll nicht im Quelltext vorliegt, ist es auch praktisch unmöglich, weitere Schlußfolgerungen zu ziehen.

    Du wirst entweder mit der AV leben müssen (ist ja nur im Debug-Build mit CodeGuard), oder du deaktivierst CodeGuard eben. Du ersparst dir wahrscheinlich sowieso viel Mühe, wenn du CodeGuard in der Debug-Konfiguration deaktivierst und eine separate CodeGuard-Konfiguration erstellst, die du dann nur gezielt benutzt (etwa wenn du eine Fehlerursache anders nicht findest, vor dem Release die letzten Speicherlecks finden willst etc.).



  • Guten Morgen,

    das ist ja jetzt mal wirklich Interessant. Das heisst dann aber auch, das sich dieser CodeGuard-Bug ja auch schon im RAD Studio 2007 befindet, denn auch dort ist der gleiche Effekt.
    Allerdings habe ich bei der Rückportierung meiner Projekts auch gesehen, das der in einem anderen Tread von mir angesprochende Fehler der TStringGrid->MouseCoord Methode wirklich nur im XE2 auftritt.

    Auf jeden Fall vielen Dank. Dann weis ich jetzt zumindest das ich mit der Anwendung von std::map nicht wirklich falsch liege.

    Deinen Vorschlag mit einer separaten CodeGuard-Konfiguration werde ich mir auf jeden Fall anschauen.

    Grüße Netzschleicher


Log in to reply