[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); } };-
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.
-
Kommentiere ich eine (egal welche) Zeile aus, sodass nur ein ptr_vector in der Klasse ist, funktioniert das ganze ohne Segfault.
-
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_managerzeigen 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...