Problem mit eigener Smartptr-Klasse
-
Ich möchte eine eigene Smartpointerklasse mit Referenzzählung entwickeln, aber ich habe ein Problem:
Wie soll ich die Referenzzählung entwickeln, mit statischen Varaiblen ist schlecht, weil somit alle Smartpointer die auf unterschiedliche Instanzen einer Klasse zeigen alle gezählt werden, ich will aber nur die zählen, die auf die Selbe Instanz zeigen. Wenn ich die Referenzzählung mit ner normalen int Varaible mache, gehts auch net, weil sonst alle Klassen, die auf die Selbe instanz zeigen einander bekannt sein müssen, damit überall die gleiche Zahl an Referenzen steht.thx
Glamdring
-
hi,
das machst du so:die Klasse hat einen member int* ref_count;
ctor der klasse macht das:
ref_count = new int(1);
copyctor macht das:
ref_count = copy.ref_count; ++ *ref_count;
operator= macht das:
-- *ref_count; if( *ref_count == 0 ) delete ref_count; //else [Edit: das else ist natürlich falsch] { ref_count = assign.ref_count; ++ *ref_count; }
dtor macht das:
if( -- *ref_count == 0 ) delete ref_count;
Wahrscheinlich ist es am besten wenn du noch ne private member funktion destroy() einführst, die dann anstatt dem delete im dtor und op= aufgerufen wird.
destroy() löscht dann ref_count und das gekapselte Objekt.
-
Deine Implementierung crasht bei Selbszuweisung, wenn es nur einen einzigen Smartpointer auf die Instanz gibt. Und das else im op= stimmt auch nicht. Das muß auf jeden Fall passieren.
-
Jester schrieb:
Deine Implementierung crasht bei Selbszuweisung, wenn es nur einen einzigen Smartpointer auf die Instanz gibt. Und das else im op= stimmt auch nicht. Das muß auf jeden Fall passieren.
Normalerweise prüft man vorher auf Selbstzuweisung.
-
oder man verwendet die exceptionsichere Standardimplementierung eines Zuweisungsoperators
-
Upsi, das es so leicht ist hätte ich nicht gedacht, naja thx @ all
mfg