Pointer erstellen danach object zuweisen
-
Hi!
Ich habe folgenden code:vector<char> *shm=attach(); vector<char> vect; *shm=vect; for(int i=0;i<3;i++){ vect.push_back('b'); } cout<<(*shm).size()<<endl; //ergibt 0 cout<<vect.size()<<endl; //ergibt 3Was mach ich bei meinem Pointer falsch?
thx for help
-
`*shm=vect;
`
Du weist nicht dem Pointer einen neuen Wert zu sondern kopierst vect dahin wo dein Pointer hinzeigt. Nachfolgende Änderungen am Original von vect verändern natürlich die Kopie nicht.
-
danke

ist es denn eine deepcopy, oder nur eine normale?
EDIT: Wie weise ich ihn denn zu?
-
Anderro schrieb:
Hi!
Ich habe folgenden code:vector<char> *shm=attach(); vector<char> vect; *shm=vect; for(int i=0;i<3;i++){ vect.push_back('b'); } cout<<(*shm).size()<<endl; //ergibt 0 cout<<vect.size()<<endl; //ergibt 3Was mach ich bei meinem Pointer falsch?
thx for helpIch vermute mal du wunderst dich, warum nicht beide die gleiche Größe haben.
*shm=vect;An dieser Stelle erstellst du eine Kopie des Vektors.
Du weist einen Vektor einem anderen Vektor zu, wodurch der Inhalt des einen
in den anderen kopiert wird.Nebenbei:
cout<<(*shm).size()<<endl;schreibt man in der Regel als
cout<<shm->size()<<endl;Gruß,
XSpille
-
Eigentlich ist das Gegenteil einer deep copy eine shallow copy(Oberflächliche Kopie). Du kannst davon ausgehen das alle Klassen der Standardbibliothek deep copy machen, so auch vector.
-
Wenn ich jetzt
(*shm).push_back('a');mache kriege ich ein Segmentation fault. Liegt das an dem Pointer den attach() mir zurückgibt?
-
Oberon_0 schrieb:
Eigentlich ist das Gegenteil einer deep copy eine shallow copy(Oberflächliche Kopie). Du kannst davon ausgehen das alle Klassen der Standardbibliothek deep copy machen, so auch vector.
Seit wann das denn?
std::vector kopiert doch nur die Objekte, die direkt in diesem liegen.
Alles andere kommt höchstens durch die spezifischen Copy-Konstruktoren.Wenn ich nen std::vector<Foo*> kopiere, würde ich es nicht als deep copy
bezeichenen, denn es werden ja nur die Zeiger kopiert
-
Anderro schrieb:
EDIT: Wie weise ich ihn denn zu?
So:
vector<char> *shm; vector<char> vect; shm=&vect; // Pointer nicht dereferenzieren, stattdessen Adressoperator benutzen for(int i=0;i<3;i++){ vect.push_back('b'); } cout<<(*shm).size()<<endl; //ergibt 0 cout<<vect.size()<<endl; //ergibt 3Und schon sind wir in den Tiefen des Pointerdschungels wo sich niemand freiwillig hinwagen sollte.
-
Anderro schrieb:
Wenn ich jetzt
(*shm).push_back('a');mache kriege ich ein Segmentation fault. Liegt das an dem Pointer den attach() mir zurückgibt?
Ja, das wird daran liegen, dass an der Stelle wo shm hinweist nicht genug Platz für deine Vectorkopie war. Was ist denn attach()?
-
attach() erzeug ein shared memory
vector<char> *attach() { char c; int shmid; key_t key; vector<char> *shm; /* * We'll name our shared memory segment * "5678". */ key = 5678; /* * Create the segment. */ if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) { cerr<<"shmget"; exit(1); } /* * Now we attach the segment to our data space. */ if ((shm = (vector<char> *)shmat(shmid, 0, 0)) == (vector<char> *) -1) { cerr<<"shmat"; exit(1); } return shm; }
-
Guck Dir mal boost::interprocess an, da gibt Shared Memory, auch für Container, was normalerweise problematisch ist.
Simon