vector-klasse -> problem mit call-by-reference



  • Hi, ich ein Problem mit der Uebergabe eines Vektors per Referenz.
    Urspruenglich habe ich den Code unter Linux geschrieben und ihn heute auf Windows per MinGW portiert.
    Dabei musste ich feststellen, dass sich der portierte Code unter Wine beim Aufruf der push_back-Funktion des per Referenz uebergeben Vektors einfach aufhaengt.
    Merkwuerdigerweise funktioniert der selbe Code unter Linux einwanfrei.
    Gibt es prinzipielle Unterschiede bei der Implementierung bzw. im Verhalten der C++-Vektorklasse unter Windows und Linux?

    Hier ein kurzes Beispiel:

    void to_vect(Object *target,vector<Object> *target_obj)
    {
        target->name = "test;
        target_obj->push_back(*target);
    }
    


  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Linux/Unix in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi,

    prinzipiell sollten die Implementierungen von std::vector auf Windows und Linux funktional identisch sein. Ich würde eher auf einen Fehler im Handlung der Objekte (Zeiger auf ungültiges Objekt?) tippen.
    So wäre es sehr spannend, zu wissen, wie "Object" implementiert ist.
    wenn Object::name z.B. ein char* ist, macht dieses Anweisung

    porter schrieb:

    ...

    ...
        target->name = "test;
    ...
    

    schonmal nicht das, was vermutlich von ihr erwartet wird.

    Gruß,

    Simon2.

    P.S.: Die cpp-Tags (statt der "code") machen das Lesen Deines Codes für uns leichter.



  • Also

    target->name
    

    ist ein String.

    Ganz vereinfacht waere es also:

    class Object{
    
    public:
         Object();
         ~Object();
         string name;
         [...]
    };
    

    Ich uebergebe also z.B.

    std::vector<Object> o_vect;
    Object *obj = new Object();
    to_vect(obj,&o_vect);
    

    Die Vermutung mit der fehlerhaften Zeigerbehandlung hatte ich auch schon, allerdings laeuft es ja unter Linux wie gesagt ohne Probleme und das Objekt existiert auch.
    Mir waere es ja nicht mal aufgefallen, wenn ich es nicht mit der Win32-Version des g++ kompiliert haette.



  • porter schrieb:

    ...

    class Object{
    
    public:
         string name;
    ...
    

    Also dann ist das Problem nicht das von mir vermutete.

    porter schrieb:

    ...
    ...
    Die Vermutung mit der fehlerhaften Zeigerbehandlung hatte ich auch schon, allerdings laeuft es ja unter Linux wie gesagt ohne Probleme und das Objekt existiert auch....

    Dass das Programm unter bestimmten Umständen das Erwartete macht, ist leider bei C++ kein ausreichender Beleg dafür, dass es "korrekt" ist ... auch nicht bzgl. der Existenz eines Objekts. Gerade mit "ungültigen Zugriffen" kann man eine Menge "Spaß" mit scheinbar funktionierenden Programmen haben.

    An Deinem Code sieht erstmal nichts falsch aus. Aber mich überascht eigentlich die Verwendung von Zeigern in dem Beispiel. Erwartet hätte ich es eher "anders herum":
    - entweder alles mit "Autoobjekten" (also ohne new)
    - oder die Ablage im Vektor per Zeiger (damit man Polymorphie nutzen kann).

    Aber die dynamsiche Erzeugung(new), Übergabe per Zeiger und dann Ablage "by value" empfinde ich als unüblich.
    Kann natürlich rotzdem richtig und notwendig sein im konkreten Fall, birgt aber gewisse Klippen, die es zu umschiffen gilt. z.B.:
    - Im vector kann "slicing" auftreten, wenn man Polymorphie einsetzt (man hat ein "Derived" erzeugt, legt aber nur den "Base"-Teil ab),
    - wo immer ein "new" steht, lauern memory leaks, double deletes, Zugriffe auf ungültige Objekte, ....
    - ...

    Gruß,

    Simon2.


Anmelden zum Antworten