Dynamische Object Arrays in Hashtable-Template
-
Hallo zusammen, ich habe in einem kleinen Projekt ein "Hashtable"-Template erstellt. Leider führt vermutlich gerade diese zu nicht nachvollziebaren Exceptions im Programm.
Ich will jetzt nicht den ganzen Code posten und beschränke mich daher auf das nötige:Im Grunde nur die deklarationen der 2 Arrays und die Add-Funktion.
template<class T> class HashTable { public: T ** Objects; // The Unknown Object const char ** IDs; // The Objects of Strings int Size; // The Size of this Hash ... // // Adds an object to the hash with a referring ID // void Add(const char * ID, T * Object) { try { // // Just add the new object // if no corresponding ID exists // if( Get(ID) == NULL) { T ** savObjects = NULL; const char ** savIDs = NULL; // Save actual Objects if there are objects to save if(Size > 0) { // // save actual Objects // //savObjects = new T*[Size]; //savIDs = new const char*[Size]; savObjects = Objects; savIDs = IDs; } // // create new bigger Objects // Size++; Objects = new T*[Size]; IDs = new const char*[Size]; if(savObjects != NULL) { // // Fill new Objects with old objects // for(int i = 0; i < Size - 1; i++) { IDs[i] = savIDs[i]; Objects[i] = savObjects[i]; } // // Delte Helper-Objectss // delete [] savObjects; delete [] savIDs; savObjects = NULL; savIDs = NULL; } // // Add the new object to the Objects // Objects [Size - 1] = new T(); *Objects[Size - 1] = *Object; IDs [Size - 1] = new char[strlen(ID)]; strcpy((char*)IDs[Size - 1] ,ID); } } catch(...) { printf("Exception catched in Hashtable.Add\r\n"); } // Print(); }; ... };
Ich hoffe ein erfahrerener Programmierer kann mir weiterhelfen.
Danke im voraus.
Nils
-
Inkludir mal <exception> und dann ersetzt du den catch Block durch:
catch(exception&except) { printf("Exception catched in Hashtable.Add : %s\r\n", except.what()); }
Wenn es sich um eine Standardexception handelt wird dies eine vielleicht brauchbare Fehlermeldung zurück geben.
Also in deinem Code gibt es nicht viel das throwen könnte : Get(ID), new, T(). Wobei es bei Get und T auf die Implementirungen der jeweiligen Funktionen ankommt und new bad_alloc wirft fals es keinen Speicher mehr gibt (sehr unwahrscheinlich).
Ich glaub nicht, dass es an einer Exception liegt. Höchstens eine Segmentation fault.
PS: Hier würden dir vector und string das Leben viel leichter machen.
-
Danke für die rasche Antwort erstmal.
Ich habe mal die Exceptions eingebunden, leider haben sich dann die geworfenen Exceptions im Aufrufstack quasi zurückbewegt. Ich habe dann nach und nach die Funktionen mit selbigem Catch-Block ausgestattet bis ich bei meiner main() ankam. Wenn ich dort den Catch-Block umwandle, dann krieg ich nur ein Exception-Fenster mit verweis auf ne Speicheradresse 0xff0ffff oder so. Nach Neuerstellung ist diese Meldung aber auch weg und das Programm scheint wieder mal zu laufen. Bei einem Freund von mir läuft es aber gar nicht und die Log-Datei wird nichtmal zu ende geschrieben.
Also haben mir die Exceptions jetzt nicht allzuviel gebracht.
Ich bin eher ein C++ Newbie und hab nicht so den Plan von standard-libs usw, wie der von Dir angesprochene Vector.
Ich versuche einfach Plattformübergreifendes C++ zu schreiben und schreibe daher so grundlegende Klassen immer selbst.Kannst Du mir vielelicht eine gute Seite empfehlen die einen guten Überblick verschafft und vielleicht sogar eine Seite die die von Dir angesprochenen Objekte <vector> und string ein einem von mir erdachten Hastable für C++ schon in perfektion vereint ?
Wäre klasse, denn dieses suchen nach Fehlern ohne Anhaltspunkte macht nach 3 Tagen echt kein Spass mehr und ich wollte das Projekt jetzt endlich mal durchziehen.
Danke für die Hilfe
Nils
-
ist nicht ganz komplett, aber das wichtigste ist drin
-
Oppodelldog schrieb:
dann krieg ich nur ein Exception-Fenster mit verweis auf ne Speicheradresse 0xff0ffff oder so.
Das ist keine C++ Exception, das ist eine Segmentation fault. Du greifst irgendwo auf Speicher zu der dir nicht gehört. Das kann ein Pointer sein der ins nichts zeigen oder ein Arrayoverflow. Lass mal dein Program mit dem Debugger laufen, der sollte dir die genau Stelle zeigen an der sich der Fehler bemerkbar macht.
Oppodelldog schrieb:
Ich bin eher ein C++ Newbie und hab nicht so den Plan von standard-libs usw, wie der von Dir angesprochene Vector.
Ich versuche einfach Plattformübergreifendes C++ zu schreiben und schreibe daher so grundlegende Klassen immer selbst.std::vector und std::string sind bei jedem standard kompatiblen Compiler dabei. Da wird nichts platformabhänig durch ihren gebrauch.
-
Der Debugger konnte mir leider nicht weiterhelfen, der ist immer in ner DLL im Assembly hängen geblieben. (MSVCRT.dll und NT.dll oder so) da würde mir selbst der Source-Code dieser Dlls nix bringen.
Und der Fehler trat ja auch immer an ner anderen Stelle auf.Ich habe jetzt meine Hashtable-Klasse einfach als Wrapper für das zusammespiel
des Vectors <T*> und string umgewandelt.Jetzt läuft alles ohne Probleme.
-----
Ich frage mich nur was denn an meiner Klasse so falsch war. Bei Zugriffen habe ich immer auf NULL getestet oder die Hash.Size gecheckt. In einem test habe ich auch mal 10 oder 100.000 ints reingeladen.Komisch ist auch, dass zum beispiel LUA (welches ich eingebunden habe) auch diese Fehler verursachte oder SDL.
Von daher hört sich das ja eher so an, als hätte ich fremden Speicher allokiert oder so
Na ja, wer Lust hat dem Fehler auf den Grund zu gehen, der melde sich, ich werde dann die komplette Klasse zur Analyse zur Verfügung stellen.
Aber das ist jetzt kein Problem, sondern soll nur dem interesse dienen.
-------Programm läuft, alles wunderbar.
PS: Wäre nur schön, wenn mein Programm ohne std 30kb kleiner wär