2014-12-11 10 views
8

Ich habe folgenden Code in „Die Programmiersprache C++, 4. Auflage“ gefunden, Kapitel 17.5.1.3C++ geteilt verwickelt Zeiger

struct S2 { 
    shared_ptr<int> p; 
}; 

S2 x {new int{0}}; 

void f() 
{ 
    S2 y {x};    // ‘‘copy’’ x 
    ∗y.p = 1;    // change y, affects x 
    ∗x.p = 2;    // change x; affects y 
    y.p.reset(new int{3}); // change y; affects x 
    ∗x.p = 4;    // change x; affects y 
} 

ich nicht die letzte Bemerkung verstehen, sollte in der Tat yp zu einem neuen Punkt Speicheradresse nach dem Reset() -Aufruf, und so

∗x.p = 4; 

sollte yp unverändert lassen, ist es nicht?

Danke

+2

Klirren andere Meinung zu sein scheinen [es sagt yp 3 am Ende ist] (http://coliru.stacked-crooked.com/a/c687c657a22cb323) – Borgleader

+0

Es ist ein großes Buch gibt es zwangsläufig zu falschen Beispielen, siehe meine letzte [Frage hier für ein anderes Beispiel] (http://stackoverflow.com/q/27158812/1708801) wie Bjarne sagt [hier] (http: //www.stroustrup. com/4.html) * Fühlen Sie sich frei, mir vorgeschlagene Errata zu senden. Ich werde jeden Fehler beheben, der innerhalb der Beschränkungen des Buches behoben werden kann *. Wie Sie ihn erreichen können, finden Sie auf der [Hauptseite] (http://www.stroustrup.com/). –

Antwort

5

Das Buch ist falsch und Sie haben Recht. Sie könnten erwägen, dies an Bjarne zu senden, damit es beim nächsten Druckvorgang behoben werden kann.

die korrekten Kommentare sein könnte:

S2 y {x};    // x.p and y.p point to the same int. 
*y.p = 1;    // changes the value of both *x.p and *y.p 
*x.p = 2;    // changes the value of both *x.p and *y.p 
y.p.reset(new int{3}); // x.p and y.p point to different ints. 
*x.p = 4;    // changes the value of only *x.p