pointer auf pointer multithreaded



  • Hi
    Ich hab ein sehr schräges problem und muss mir überlegen ob ich das design des programmes nicht umstellen muß.

    ich hab eine multithreaded application ( server client ) wo ich klassen in einem vector speicher ( die client threads im prinzip ).

    dafür hab ich natürlich eine liste aller thread klassen.
    jetzt würde ich gerne den klassen private listen mit der referenz einiger klassen mitgeben.

    sollte an einem der threads eine exeption bei der tcp connection passieren, dann will ich die klasse entfernen die die exception ausgelöst hat.

    da ich jetzt mehrere listen hab ( private und die hauptliste ) hab ich mir gedacht ich mach einfach einen pointer auf einen pointer auf eine klasse.

    damit könnte ich das objekt zerstören und den zwischenpointer auf NULL setzen.
    damit kann ich bei jedem zugriff auf die liste von pointer auf pointer immer abfragen ob das objekt noch existiert und wenn der zwischenpointer NULL ist einfach das aus dem vector entfernen ( die listen halten sich selbst sauber ).

    tatsächlich funktioniert das aber überhaupt nicht.

    ich geb mal ein simples code beispiel:

    vector<klasse**> cl1;
    	vector<klasse**> cl2;
    	unsigned int i;
    for (i = 0; i < 5; i++){
    // neue klasse instanzieren und den pointer darauf in c speichern
    	klasse *c = new klasse();
    // objekt mit daten füllen
    	c->h = i;
    	c->w = i;
    	c->x = i;
    	c->x = i;
    	klasse **d = &c;
    	cout << (*d)->w << endl;
    // pointer auf pointer in vector speichern
    	cl1.push_back(d);
    	cl2.push_back(d);
    }
    // ausgabe mit prüfung ob zwischenpointer null ist
    for (i = 0; i < cl1.size(); i++){
    	if ( *cl1.at(i) == NULL) { cout << "obj ist NULL" << endl; } else { cout << "erg:" << (*cl1.at(i))->w << endl;}
    }
    

    allerdings scheint eu so zu sein, als würde ich nur den c* verbiegen.
    letzten endes hab ich in der liste immer nur "4" stehen und alle zwischenpointer zeigen auf das gleiche objekt.
    wobei ich natürlich die referenzen auf alle anderen objekte verliere.
    -> sehr schlecht 🙂

    leider helfen mir auch die boost smart pointer nicht, weil die das umgekehrte problem angehen - die löschen das objekt wenn keine referenz mehr vorhanden ist.
    ich möchte aber im prinzip das objekt löschen wären noch referenzen existieren und das abfragen.....

    hoffe das war verständlich und sicher zu lange zum lesen 🙂

    lg
    Verucca



  • Hallo Verucca,

    ich hab zwar noch nicht alles verstande, was du vo hast,
    allerdings ist mir nen (vermeintlicher) grundlegender Fehler aufgefallen.
    Die Vectoren liegen auf dem Stack:

    vector<klasse**> cl1;
        vector<klasse**> cl2;
    

    Beim Starten eines neuen Threads läuft der ursprüngliche weiter und
    überschreibt deinen Stack. (Es sei denn du blockierst den Aktuellen -> nicht elegant)

    Und an dieser Stelle machst du z.B. nen Verweis auf ne Stack-Adresse.

    klasse **d = &c;
    

    und dadurch, dass der Block "}" geschlossen wird, gibst du alles frei, was in
    diesem Scope {...alles dazwischen...} auf den Stack gelegt wurde, folglich auch diesen Zeiger

    klasse *c
    

    DEFINITIVE FEHLERQUELLE

    Gruß,
    CSpille



  • btw:

    Du hast Glück, dass dein Programm nicht ganz auf die Nase fliegt wegen
    des Problems, was ich gesagt habe, aber der Stack ist scheinbar noch nicht so
    weit überschrieben (segmentation fault)
    Warum du nur 4 Objekte drin hast, sehe ich jetzt auf Anhieb nicht,
    allerdings besitzt

    klasse *c
    

    innerhalb der for-Schleife immer die selbe Adresse (aufm Stack) und folglich
    hast du auch immer nen Zeiger auf die gleiche Adresse.

    Gruß,
    CSpille

    EDIT:
    Ah...
    Du hast den Wert 4 drin und nicht 4 Objekte...
    Das sollte sich aber dadurch erklärt haben.
    btw: Dein Problem hat nix mit Multithreading zu tun.



  • Ich hoffe das hilft dir schonmal weiter...


Anmelden zum Antworten