Auf Heap erzeugtes Objekt zerstören
-
In meinem Programm lasse ich mir das Objekt für meine Datenbankverbindung in einer Methode erzeugen und liefer dann den Pointer auf diese Objekt als Rückgabewert zurück.
Nun hab ich das Problem, das der Variablenname außerhalb der Methode, wo die Variable auf dem Heap erzeugt wird, nicht bekannt ist. Wie kann ich das Objekt denn jetzt wieder zerstören?
Hier die besagte Methode:
ConnectDB* createConnection() { char DBuser[21]; char DBpwd[21]; std::cout<<"Geben Sie bitten ihren Benutzernamen an, um sich an der Datenbank anzumelden."<<std::endl; std::cout<<"Benutzername: "; std::cin.getline(DBuser,20); std::cout<<"Geben Sie bitten ihr Passwort an."<<std::endl; std::cout<<"Passwort: "; std::cin.getline(DBpwd,20); ConnectDB* myConnection = new ConnectDB("localhost",DBuser,DBpwd,"unternehmen",3306); //ConnectDB myConnection("localhost",DBuser,DBpwd,"unternehmen",3306); return myConnection; }
Hier der Programmschnipsel wo ich den Aufruf benutze
result = myReq.selectAll(createConnection()->pConnection); //hätte jetzt gedacht ich könnte das Objekt jetzt so benutzen destroyConnection(myConnection); //Allerdings ist die Variable myConnection hier unbekannt, wieso? Dachte Variable die auf den Heap erstellt werden sind global verfügbar?
-
Also dein Problem verstehe ich nicht wirklich:
ConnectDB *myConnection = createConnection(); result = myReq.selectAll(myConnection->pConnection); //hätte jetzt gedacht ich könnte das Objekt jetzt so benutzen destroyConnection(myConnection);
Das normaleste der Welt, oder?
-
Der Name ist nur in der Funktion bekannt, die Adresse wird jedoch nach außen übergeben - und du bist dafür verantwortlich, dir diese Adresse zu merken.
-
Entgegen der Meinung verschiedener Forumsmitglieder, bin ich der Meinung dies ist der typische Anwendungsfall für einen Smart-Pointer.
Ich würde für diese Anwendung einen boost::shared_ptr verwenden. Der Speicher wird von Smart-Pointer automatisch freigegeben, wenn niemand mehr den Zeiger verwendet.
Sven
P.S. Leute die noch nie einen Smart-Pointer verwendet haben, bitte nicht mit dem std::auto_ptr beginnen, da dieser nicht immer das macht, was der Programmier erwartet.