STL map und Speicherbelegung

Hi,

ich habe eine Frage zur Speicherbelegung einer map(STL).
Ich habe mir eine Map instanziiert und fülle diese mit Strings die dynamisch allociert sind (new string() ).
Die Frage die ich nun habe ist, wenn ich die map freigebe nehme ich an, dass der Destruktor der map aufgerufen wird. Was passiert mit dem Speicher, den die Strings einnehmen? Wird der destructor dieser Strings von der map aufgerufen, oder ist der Speicher verloren?

Kann mir da jemand was zu sagen?

Vielen Dank
Karsten

Hi Karsten :smile:

Weil du map benutzst, wird beim Beschreiben der Map eine Kopie des Strings erzeugt, den du mit new angelegt hast. Diese Kopie wird selbstverständlich auch wieder vollständig aus dem Speicher entfernt, wenn du die Map freigibst. Allerdings bleiben die von dir mit new erzeugten Objekte bestehen. Du musst sie explizit mit delete wieder entfernen.

Ich verstehe noch nicht ganz, warum du die Strings auf dem Heap überhaupt erzeugst, du brauchst sie doch nur als temporäre Objekte. Wenn sie einmal in der Map stehen, bleiben sie dir ja erhalten …

cu Stefan.

Danke für die Antwort!

Hi Karsten :smile:

Ich verstehe noch nicht ganz, warum du die Strings auf dem
Heap überhaupt erzeugst, du brauchst sie doch nur als
temporäre Objekte. Wenn sie einmal in der Map stehen, bleiben
sie dir ja erhalten …

Währe es dann nicht geschickter sie als
map zu übergeben oder werden sie dann nicht automatisch gelöscht? Mir geht’s hier um die Laufzeit. Wenn ich den Kopierkonstruktor verwende, dann kostet das einen Konstruktor und Destruktoraufruf.
Wie währe es am Sinnvollsten?

Gruß Karsten

Hi Karsten :smile:

Währe es dann nicht geschickter sie als
map zu übergeben oder
werden sie dann nicht automatisch gelöscht?

Referenzen können nicht deklariert, sondern nur definiert werden. Das bedeutet, dass man ihnen direkt bei der Variablenvereinbarung einen Wert zuweisen muss.

int &test2= test; //Das funktioniert

int &test2; //Das gibt Haue vom Compiler
test2= test;

Daher könntest du lediglich mit Pointern arbeiten:

map

Dann bekommst du allerdings Probleme, weil die map dann beim Einfügen die Speicheradressen vergleicht und nicht die Strings selber. Das ist sicherlich auch nicht erwünscht. Die STL bietet dir allerdings die Möglichkeit, eine eigene Vergleichsroutine zu verwenden. Aber das ist eine ganz häßlich Syntax :frowning:

Mir geht’s hier um die Laufzeit. Wenn ich den Kopierkonstruktor
verwende, dann kostet das einen Konstruktor und
Destruktoraufruf.

Beide Aufrufe (Copy-Konstruktor und Destruktor) sind aber billig. Normalerweise werden strings mit Referenz-Counting implementiert. Eine Befehlsfolge wie diese:

string a= „Egon“;
string b= a;

bewirkt dann, dass der String „Egon“ bei der Definition von a erzeugt wird und sein Referenzzähler auf 1 gesetzt wird. Bei b=a wird dann nur ein Verweis auf String a erzeugt und der Referenzzähler von „Egon“ auf 2 gesetzt. Daher ist ein Copy-Konstruktor quasi umsonst. Der Destructor von a oder b vermindert nur den Referenzzähler um 1. Erst der Destructor, der bei einem Referenzzähler von 1 aufgerufen wird, muss den String wirklich aus dem Speicher entfernen. Referenzzählung ist also eine gute Sache. Allerdings sind Schreibzugriffe recht teuer. Wenn du z.B. den Wert von b ändern möchtest, muss erst eine echte Kopie von „Egon“ für b angelegt werden. Diese Technik nennt man „copy on write“. Nunja, auf jeden Fall brauchst du dir bei Copy-Constructor und Destructor keinen Stress wegen der Laufzeit zu machen :smile:

Viele Grüße

Stefan.

Also vielen Dank,

ich hab mich daran gehalten und erzeuge keine Strings mehr auf dem Heap, sondern lasse den Kopierkonstruktor oder den Linkzähler und der map (jetzt multimap) die Arbeit machen.

Noch mal Danke für die Hilfe Karsten