2012-04-11 11 views
2

Betrachten Sie dieses Stück Code:macht eine Kopie für eine Variable

int *a, *b; 
a = foo(); 
if (a) 
    b = a; 
a = bar(); 

Das Problem ist, wenn a Updates durch den Aufruf bar(), b auch Updates. Ich möchte jedoch ein Backup erstellen, indem Sie b = a verwenden. Was ist das Problem?

+0

Ich kann die Frage nicht verstehen. Könnte klarer sein, was du meinst, wenn du sagst "wenn ein Update kommt" und "b auch updates". –

+0

@David Heffernan: Ich meine, wenn 'a = bar()' ausgeführt wird, wird 'b 'auch auf den neuen Wert von' a' geändert. – mahmood

+2

Nein, das ist einfach nicht möglich. –

Antwort

0
int *a, *b; 
b = new int; 

a = foo(); 
if (a) 
    *b = *a; 
a = bar(); 
... 
delete(b); 

(Der Wert bei der Adresse a wird an der Adresse b auf den Wert zugewiesen.)

Was Sie jetzt tun, ist a und b Punkt zum gleichen Platz im Speicher zu machen. Wenn dann der Wert in a oder b aktualisiert wird, zeigen beide Zeiger auf den neuen Wert.

Übrigens, wenn bar() einen Zeiger zurückgibt, möchten Sie wahrscheinlich *a = foo() und *a = bar().

+0

'b' ist nicht initialisiert (d. H. Enthält undefinierte Speicheradresse), dies würde also eine Zugriffsverletzung darstellen. –

+0

Nun, ich habe hier keinen vollständigen Code angegeben, aber ich nehme an, Sie haben Recht. Fest. –

+0

Jetzt haben Sie ein Speicherleck. Und von C++ - Göttern für die Verwendung von 'malloc' anstelle von' new' verpönt werden;) –

1

Sie könnten nur den Wert eines sichern:

int *a, b; 
a = foo(); 
if (a) 
    b = *a; 
a = bar(); 

oder wenn Sie wollen b als Zeiger halten:

... 
    *b = *a; 
... 
0

wenn a == b, dann bar() ist Ändern des Wertes bei a, nicht Zuweisen eines neuen a. Dies macht den meisten Sinn Speicher. Wenn Sie etwas Interessantes haben, ist die tatsächliche Ganzzahl, nicht die Adresse, anstelle der Zuweisung von b = a assign * b = * a.

0

Die ...

int *a; 
// ... 
a = foo(); 

... würde nicht kompilieren, selbst wenn die Funktion als int foo(); erklärt wurde, so dass ich nehme an, es als int* foo(); erklärt wird. Dito für int* bar();.

Geben Sie keinen rohen Zeiger wie diesen zurück. Es ist möglicherweise nicht klar, ob Anrufer delete es oder nicht. Die gute Dokumentation kann nur teilweise dieses Problem lösen (Menschen neigen dazu, die Dokumentation von Zeit zu Zeit zu ignorieren). Warum nicht einfach die Ganzzahl Wert kopieren, oder zumindest eine Referenz auf Integer zurückgeben, falls sie wirklich geteilt werden muss?

aber sagen, dass in Ihrem speziellen Fall, foo() und bar() verwenden anscheinend das gleiche int „Objekt“ intern, so a auf das gleiche Objekt zeigen weiterhin als b auch nach bar() verändert wurde.

Verwandte Themen