new und delete Operator
-
Hi,
ich leg mir eine std:map oder ähnliches auf dem Heap an mit dem new Operator. Wenn ich diese nicht mehr benötige, lösche ich die map mit delete...
typedef std::map<int, int> IntMap; IntMap *pMap = new IntMap(); //do somethign //map wird unter bestimmten bedingungen gelöscht delete pMap; //abfrage ob map bereits gelöscht worden ist oder nicht schlägt fehl... if(pMap != NULL) { }Die Map wird aufgrund der internen Programmsturktur nicht in jedem Fall gelöscht bzw. deleted, so dass sie auch bei der anschließenden if-Abfrage vorhanden sein kann. Allerdings ist es so, dass die if-Abfrage auch dann true ist, wenn die pMap bereits deleted worden ist. Wie kann ich das umgehen? Nur dadurch, dass ich nach dem delete -> pMap = NULL schreibe????
Gruß
Jens
-
Jens Ludwig schrieb:
Nur dadurch, dass ich nach dem delete -> pMap = NULL schreibe????
Das ist der Standardweg mit rohen Zeigern. Die Frage ist, warum du diese überhaupt benutzen möchtest? Ich empfehle dir Smart Pointer, solltest du C++0x verwenden können dann den unique_ptr.
Die nächste Frage wäre, warum du die Map überhaupt auf den Heap anlegen möchtest? Reicht es nicht, die Map auf den Stack anzulegen, dann einfach mymap.clear(); aufzurufen und anschließend zu überprüfen, ob mymap.empty() ist?
mfg, NRWsoft
-
Und ich frage mich, wieso die Map vom Heap gelöscht werden kann und danach noch irgendwelche Zugriffe möglich sind. Wieso ist die Lebensdauer anders als beim übergeordneten Objekt?
-
Eisflamme schrieb:
Und ich frage mich, wieso die Map vom Heap gelöscht werden kann und danach noch irgendwelche Zugriffe möglich sind. Wieso ist die Lebensdauer anders als beim übergeordneten Objekt?
Die Zugriffe auf freigegebenen Speicher sind undefiniertes Verhalten. Dazu zählt auch, dass sie funktionieren dürfen.
-
Meine Frage zielte nicht darauf, wieso das allgemein geht, sondern wieso das in seinem Context so möglich ist.
Wenn ich etwas dem Heap anlege, lösche ich es meistens trotzdem im dtor des Objektes, welches es hält, sodass ein Zugriff per se gar nicht mehr passieren kann. Jetzt gibt es tausend Fälle, wo das nicht der Fall sein muss, aber da die Frage sehr grundsätzlich ist, wollte ich auch prüfen, ob er da nicht vll. was unnötig ist.