[gelöst durch nachdenken] pointer, boost und vectors



  • Hallo,

    Ich habe eine Klasse "Base", und zwei abgeleitete Klassen. Nun möchte ich mehrere Objekte davon in einer Liste speichern:

    base:

    class base : boost::noncopyable // So korrekt?
    {
     public:
      virtual ~base() {}
      virtual void mach_was(p1, p2)=0; //p1 und p2 sindeigentliche andere Typen...
    };
    

    verwaltende Klasse:

    class base_manager
    {
     protected:  
      boost::ptr_vector<base> name1; // DIE STELLE...
      boost::ptr_vector<base> name2;
    
     public:
      base_manager() { /*...*/ }
      ~base_manager();
    
      void add_1(base* elem) { name1.push_back(elem); }
      void add_2(base* elem) { name2.push_back(elem); }
    };
    
    1. Leider schmeißt das ganze einen Segfault, nachdem der Destruktor (reine Ausgabefunktion) der manager-Klasse fertig ist. Scheinbar gibt es Probleme, die beiden ptr_vector's zu löschen.

    2. Kommentiere ich eine (egal welche) Zeile aus, sodass nur ein ptr_vector in der Klasse ist, funktioniert das ganze ohne Segfault.

    3. Greife ich auf den zweiten (also den jeweils unteren, vertauschen bringt nichts...) ptr_vector zu, schmeißt er eine "bad_alloc"-Exception und bricht ab.

    Ich habe scheinbar was wichtiges bei den Boost-Containern übersehen, habe gerade erst mit boost angefangen...

    Die Doku: http://www.boost.org/doc/libs/1_38_0/libs/ptr_container/doc/tutorial.html
    hat mir auch nicht wirklich geholfen. Das sieht doch genauso aus? 😕

    Bin mir sicher, das ihr mir helfen könnt, danke im voraus!



  • Wie sieht denn das aus, wenn du add_1 und add_2 aufrufst?
    Ich habe die starke Vermutung, dass du da etwas übergibst, was bereits aufgeräumt wird, wie z.B automatische Objekte.



  • base_manager.add_1(new derive1());
    base_manager.add_2(new derive2());
    

    Aber der Segfault kommt auch, wenn die ptr_vectors leer sind... 😞



  • Kannst du mal Konstruktor und Destruktor von base_manager zeigen und die Stelle markieren, an der der Segmentation Fault auftritt? Was steht denn in der Fehlermeldung?

    Ansonsten hast du keine Abhängigkeiten mehr, hast du ein Minimalbeispiel versucht?



  • Schon den Debugger angeworfen?



  • Vergesst es, ich bin doof...
    Natürlcih habe ich ein lokales Objekt (nix mit Heap..) in einer derive-Klasse löschen wollen... 😃

    Danke trotzdem...


Anmelden zum Antworten