Seite 1 von 1

vectoren SIGSEGV

Verfasst: 14. Februar 2010 23:26
von dejan2112
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 ?

Verfasst: 14. Februar 2010 23:30
von Christian81
Wenn du ein und denselben Pointer zweimal löschst gibt es einen Crash.

vectoren SIGSEGV

Verfasst: 14. Februar 2010 23:48
von dejan2112
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.

Verfasst: 15. Februar 2010 06:30
von Christian81
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.

vectoren SIGSEGV

Verfasst: 15. Februar 2010 21:57
von dejan2112
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

Verfasst: 15. Februar 2010 23:07
von Christian81
Nein das ist unmöglich - außer Dein Compiler ist kaputt...

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;
}