vectoren SIGSEGV

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
dejan2112
Beiträge: 10
Registriert: 11. Juli 2009 14:37

vectoren SIGSEGV

Beitrag 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 ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn du ein und denselben Pointer zweimal löschst gibt es einen Crash.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dejan2112
Beiträge: 10
Registriert: 11. Juli 2009 14:37

vectoren SIGSEGV

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
dejan2112
Beiträge: 10
Registriert: 11. Juli 2009 14:37

vectoren SIGSEGV

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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;
}
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten