2008-09-26 9 views
6

Angenommen ich eine Klasse foo haben, und wollen eine std :: map verwenden, um einige boost :: shared_ptrs zu speichern, zB:boost :: shared_ptr Standardcontainer

class foo; 

typedef boost::shared_ptr<foo> foo_sp; 
typeded std::map<int, foo_sp> foo_sp_map; 

foo_sp_map m; 

Wenn ich fügen Sie einen neuen foo_sp auf die Karte aber der verwendete Schlüssel existiert bereits, wird der bestehende Eintrag gelöscht? Beispiel:

foo_sp_map m; 

void func1() 
{ 
    foo_sp p(new foo); 
    m[0] = p; 
} 

void func2() 
{ 
    foo_sp p2(new foo); 
    m[0] = p2; 
} 

Wird der ursprüngliche Zeiger (p) freigegeben, wenn er durch p2 ersetzt wird? Ich bin mir ziemlich sicher, dass es so sein wird, aber ich dachte, es wäre es wert, gefragt/geteilt zu werden.

+0

Modifizierte Frage - sollte shared_ptr nicht sein auto_ptr, – Rob

+0

Es ist "sollte _have_" –

Antwort

7

First off, Ihre Frage Titel sagt boost :: auto_ptr, aber sie tatsächlich bedeuten, boost :: shared_ptr

Und ja, werden die ursprünglichen Zeiger befreit werden (falls es keine weiteren Verweise darauf gemeinsam).

0

Da stackoverflow ich nicht kommentieren kann, werde ich nur antworten. :/

Ich sehe nicht "p" außerhalb des Geltungsbereichs, so dass das Objekt, auf das es verweist, nicht freigegeben wird. "p" wird immer noch darauf zeigen.

+0

Ich sollte klar gemacht, dass p wäre nicht mehr Geltungsbereich bis zum Zeitpunkt p2 erstellt wurde. – Rob

+0

Die Einschränkung bei der Kommentierung neuer Benutzer besteht darin, neue Benutzer von der Kommentierung abzuhalten, um Sie nicht zu ermutigen, das System zu umgehen! –

1

Es hängt davon ab, was passiert in Ihrem ... Abschnitt

Ihre Container-Klasse enthält Kopien von Instanzen foo_sp, wenn Sie m[0] = p2; ausführen die Kopie von p, die ursprünglich geht Umfang aus in diesem Ort war. Zu diesem Zeitpunkt wird es gelöscht werden, wenn es keine anderen foo_sp gibt.

Wenn die Kopie, die in der zweiten Zeile foo_sp p(new foo); deklariert wurde, immer noch vorhanden ist, wird der Speicher nicht freigegeben. Der Eintrag wird gelöscht, sobald alle Referenzen darauf entfernt wurden.

Verwandte Themen