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 3
    

    Was mach ich bei meinem Pointer falsch?
    thx for help


  • Mod

    `*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 3
    

    Was mach ich bei meinem Pointer falsch?
    thx for help

    Ich 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 🙄


  • Mod

    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 3
    

    Und schon sind wir in den Tiefen des Pointerdschungels wo sich niemand freiwillig hinwagen sollte.


  • Mod

    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


Anmelden zum Antworten