STL push back funkioniert nicht.



  • Hallo, ich habe stl list in vs2008, um elemente abzuspeichern.

    die Elemente sidn folgendermaßen definiert:

    typedef struct glob_mem {
    		SOCKADDR_IN Sender;
    		int length;
    
    } GLOB_MEM, *SHAREDMEM;	
    
    class SHAREDMEM_CLASS
    {
    public:
    	SHAREDMEM el;
    	SHAREDMEM_CLASS();
    	SHAREDMEM_CLASS(const SHAREDMEM_CLASS &);
    	~SHAREDMEM_CLASS();
    };
    
    typedef std::list<SHAREDMEM_CLASS> ItemList;
    

    das problem ist das ich später beim zufügen von elementen immer undef. werte einfügen:

    //....
    rcv = recvfrom(*sock,buffer,sizeof buffer,0,(SOCKADDR*)&UDPSender,&UDPSenderLen);
    //....
    SHAREDMEM_CLASS* sharedbuff_temp = new SHAREDMEM_CLASS;
    
    	sharedbuff_temp->el->Sender=UDPSender;
           sharedbuff_temp->el->length=UDPSenderLen;
    
    	ItemList.push_back (*sharedbuff_temp);
    
    	delete sharedbuff_temp;
    

    Das Problem ist jetzt das der initialisierte werte in die Liste eingeben werden. Nicht der neu gesetzte UDPSender. obwohl in sharedbuff der neue UDP sender zwischengespeichert wurde. Bin echt am verzweifeln, kann mir das nicht erklären warum die daten in der Liste nicht stehen. es wird auch nur das Elemente geschrieben und später ausgelesen, aber immer mit unbrauchbaren werten und nicht mit den neuen übergeben die i sharedbuff_temp waren.

    danke für hilfreiche vorschläge



  • Also das zweite Codestück verwirrt mich. Kann es sein, dass du mit sharedbuff_temp in Wirklichkeit kadsharedbuff_temp meinst?

    Wenn dem so ist, dann gibt es mehrere Probleme.

    Wenn du so etwas in den container einfügst, dann wird das Objekt kopiert. Das heisst, dass bei dir der Kopierkonstruktor von SHAREDMEM_CLASS aufgerufen wird, welcher wie ich mal annehme, dass er lediglich eine flache Kopier erstellt (Zeiger werden einfach kopiert, anstatt neu angelegt).
    Dann nach dem einfügen zerstörst du das angelete Objekt und mit dem ebenfalls den Zeiger auf den SHAREDMEM , den du in der Klasse hast.

    Ansonsten sieht das ganze sehr nach C aus, als C++ (dein struct z.B). Daten gehören üblicherweise als private deklariert.

    Falls das nicht geholfen hat poste doch bitte mal ein vollständiges Beispiel, wo der gleiche Fehler auftritt.



  • oh entschuldige, nein das soll nur sharedbuff sein



  • ok, also hier die Klasse

    class SHAREDMEM_CLASS
    {
    public:
    	SHAREDMEM el;
    	SHAREDMEM_CLASS();
    	SHAREDMEM_CLASS(const SHAREDMEM_CLASS &);
    	~SHAREDMEM_CLASS();
    };
    

    und die definition der funktionen:

    SHAREDMEM_CLASS::SHAREDMEM_CLASS()   // Constructor
    {
       el = new GLOB_MEM;
       el->length = 0;
    }
    
    SHAREDMEM_CLASS::~SHAREDMEM_CLASS()   // Destructor
    {
       el->length = 0;
       delete el;
    }
    
    SHAREDMEM_CLASS::SHAREDMEM_CLASS(const SHAREDMEM_CLASS &copyin)   // Copy constructor to handle pass by value.
    { 
       el = new GLOB_MEM;
       el->length = copyin.el->length;
       el->length = copyin.el->length;
    
    }
    

    hm kann es sein das beim copy const einfach noch der sockaddr fehlt??
    also der fehler zeigt sich folgermaßen, ich bekommen eine adressen von recv rein, mit IP und Port diese übernimmt auch der sharedbuff, jedoch beim push.back wird diese Daten nicht übernommen, sondern die Werte die vor der initialisierung von sockaddr vorhander sind , sprich sharedbuff_temp->el->Sender vor dem zuweisen sowas wie (in hex) ip: cdcdcdcd und port: 52515, dann weise sharedbuff_temp neue daten z.b. IP: c0232... und port: 4775. Diese werte hat sharedbuff_temp dann auch, dann kommt das push_back. aber im element in der liste sind die "falschen werte" cdcdcdc unf 52515 drinne und nicht c0232... und 4775.

    Gruß hoffe ihr könnt helfen



  • also danke für den hinweis mit dem cpy const. es lag daran das sender nicht mitkopiert wurde. 👍



  • Den Zuweisungsoperator solltest du auch gleich definieren (oder verbieten), sonst läufst du früher oder später nochmals ins genau gleiche Problem.



  • ... das dynamisch erzeugte Objekt brauchst du ebenfalls nicht, du kommst da prima mit Stackvariablen aus.

    //....
    rcv = recvfrom(*sock,buffer,sizeof buffer,0,(SOCKADDR*)&UDPSender,&UDPSenderLen);
    //....
    SHAREDMEM_CLASS sharedbuff_temp;
    
    sharedbuff_temp.el->Sender=UDPSender;
    sharedbuff_temp.el->length=UDPSenderLen;
    
    ItemList.push_back (sharedbuff_temp);
    

Log in to reply