Hallo,
ich hoffe die Frage ist hier richtig plaziert.
Ich speicher dynamisch allokierte Objecte in einem Vector.
Wenn die verarbeitung abgeschlossen ist, delete ich zuerst die Objekte und rufe dann die Funktion clear vom vector auf.
Sauber !
Ich möchte nun einige Objecte die in diesem vector ( im weitern verlaug als Basis vector definiert ) auch noch in anderen vectoren zur verfügung stellen.
Es funktioniert auch alles wunderbar. Bis zum aufräumen.
Wenn ich die Funktion clear vom vector2 aufrufe gibt es einen SIGSEGV.
ist es nicht nötig die clear funktion aus den slave vectoren aufzurufen ?
vectoren SIGSEGV
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
vectoren SIGSEGV
ja ja , das ist mir auch schon klar. Ich habe ja an dieser stelle noch nichts gelöscht. Das Löschen der Objecte mit delete wird ja erst nachtem die Funktion Clear() aus dem vector namespace aufgerufen worden ist.
Und das Clear gibt ja keinen speicher frei dafür bin ich ja selbst für zuständig. Also liegt es nicht daran.
Und das Clear gibt ja keinen speicher frei dafür bin ich ja selbst für zuständig. Also liegt es nicht daran.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ohne etwas Code weiß ich nicht genau was Du machst. Es geht aus Deiner Beschreibung nicht hervor.
Greifst Du nach dem ersten delete noch auf die Pointer zu? Dann wären die Pointer ja auch schon nicht mehr gültig - egal ob sie im ersten oder im zweiten vector sind.
Greifst Du nach dem ersten delete noch auf die Pointer zu? Dann wären die Pointer ja auch schon nicht mehr gültig - egal ob sie im ersten oder im zweiten vector sind.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
vectoren SIGSEGV
Hi, das ist auf dem g++ repruduzierbar.
std::vector <T*> m_Base;
std::vector <T*> m_select;
T* x = new T();
m_Base.puc_back(x);
x = new T();
m_Base.puc_back(x);
m_select.puc_back(x);
m_select.clear();
m_Base.clear();
fürht zum SIGSEGV
std::vector <T*> m_Base;
std::vector <T*> m_select;
T* x = new T();
m_Base.puc_back(x);
x = new T();
m_Base.puc_back(x);
m_select.puc_back(x);
m_select.clear();
m_Base.clear();
fürht zum SIGSEGV
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Nein das ist unmöglich - außer Dein Compiler ist kaputt...
Und hier mein (funktionierender) Testcode
Und hier mein (funktionierender) Testcode
Code: Alles auswählen
#include <vector>
struct T {
int myArg1;
int myArg2;
};
int main(int arc, char** argv)
{
std::vector <T*> m_Base;
std::vector <T*> m_select;
T* x = new T();
m_Base.push_back(x);
x = new T();
m_Base.push_back(x);
m_select.push_back(x);
m_select.clear();
m_Base.clear();
return 0;
}
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung