myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

c++ segfault im destruktor

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 05.07.13, 14:43   #1
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard c++ segfault im destruktor

hallo

habe mir eine klasse für quadratische matritzen implementiert und bekomme gelegentlich eine segmentation violation im destruktor, die ich mir aber nicht erklären kann. konstruktor und destruktor sehen wie folgt aus:

Code:
template<typename T>
Matrix<T>::Matrix(unsigned int d){
  rows = d;
  m = new T*[rows];
  for(unsigned int i=0; i<rows; i++){
    m[i] = new T[d];
  }
}

template<typename T>
Matrix<T>::~Matrix(){
  for(unsigned int i=0; i<rows; i++){
    delete[] m[i];
  }
  delete[] m;
}
vielleicht sollte ich noch dazu sagen, dass m ein doppelarray, vom typ T ist, also ein T**, und darin die elemente der Matrix gespeichert werden.

sieht da jemand auf anhieb den fehler?
Quabla ist offline   Mit Zitat antworten
Ungelesen 05.07.13, 15:20   #2
inselberg
Anfänger
 
Registriert seit: Dec 2011
Beiträge: 18
Bedankt: 13
inselberg ist noch neu hier! | 0 Respekt Punkte
Standard

kein rows definiert im 2. teil...
inselberg ist offline   Mit Zitat antworten
Ungelesen 05.07.13, 15:42   #3
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard

rows ist ein attribut der klasse matrix. hier mal die klassendeklaration:

Code:
template <typename T>
class Matrix{
  protected:
    unsigned int rows;
    T** m;
  public:
    Matrix(){};                     //empty constructor
    Matrix(unsigned int d);         //constructor for matrix with d rows and collumns
    Matrix(T** _Matrix, unsigned int order);
    Matrix(const Matrix<T> &s);     //copy constructor
    ~Matrix();
    void init();                    //insert values for each component
    void print();                   //prints matrix on console
    Matrix<T> operator*(const Matrix<T> &a);
    Matrix<T> operator+(const Matrix<T> &a);
    Matrix<T> operator-(const Matrix<T> &a);
    vector<T> operator*(const vector<T> &a);
    Matrix<T> operator*(const double &a);
    void setElement(unsigned int i, unsigned int j, T val);
    T getElement(unsigned int i, unsigned int j);
};
edit:
ok jetzt kommt der segfault in einer anderen methode und zwar in

Code:
template<typename T>
void Matrix<T>::setElement(unsigned int i, unsigned int j, T val){
  try{
    if(i>rows-1) throw(DimensionError());
    if (j>rows-1) throw(DimensionError());
    m[i][j]=val;
  }
  catch(DimensionError){
    cerr << "Matrix::setElement::Dimension Error!" << endl;
    exit(1);
  }
}
die ist aber absolut dagegen abgesichert, dass die arraygrenzen überschritten werden. komisch ist auch, dass der matrix destruktor durchläuft (da habe ich testausgaben drin), wenn ich das programm ohne debugger startet. und die matrix wird erst ganz am ende meiner main() rutine entsorgt (ist dynamisch erzeugt). ohne debugger kommt auch kein segfault error sondern:

"This application has requested the Runtime to terminate it in an unusual way. Please contact the applications's support team for more information"

den fehler bekomm ich beim programmieren zum ersten mal^^
Quabla ist offline   Mit Zitat antworten
Ungelesen 08.07.13, 08:38   #4
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Deine Snippets sehen für mich soweit gut aus.
Wie hast du DimensionError deklariert?
Welchen Compiler/OS verwendest du?
germgerm ist offline   Mit Zitat antworten
Ungelesen 08.07.13, 10:22   #5
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard

danke für deine antwort

dimesnionerror ist einfach nur eine leere klasse.

Code:
class DimensionError{};
das exceptionhandling ist hier ein bisschen überflüssig eigentlich. hab die klasse mal als übung für eine klausur geschrieben und jetzt 2 jahre später brauche ich die für ein anderes fach...

ich benutze gcc unter linux (da kommt der segfault übrigens wieder im destruktor und zwar in der for schleife in der zeile

Code:
delete[] m[i];
unter windows benutzer ich mingw
Quabla ist offline   Mit Zitat antworten
Ungelesen 08.07.13, 11:06   #6
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard

ok fehler gefunden. der lag darin, dass ich eine matrix, die schon entsorgt war, weil ich auserhalb ihres gültigkeitsbereiches war, versucht habe nocheinmal zu entsorgen. danke für eure mühen.
Quabla ist offline   Mit Zitat antworten
Ungelesen 08.07.13, 11:25   #7
germgerm
bla
 
Registriert seit: Mar 2010
Beiträge: 309
Bedankt: 301
germgerm ist noch neu hier! | 0 Respekt Punkte
Standard

Und deswegen Pointer immer 0 setzen und vor dem delete abfragen
germgerm ist offline   Mit Zitat antworten
Ungelesen 08.07.13, 13:23   #8
Quabla
Mitglied
 
Registriert seit: Oct 2010
Beiträge: 299
Bedankt: 151
Quabla ist noch neu hier! | 0 Respekt Punkte
Standard

naja konkret lag es daran, dass ich in einer anderen klasse eine matrix als member hab und die nicht dynamisch erzeugt habe. also wurde die matrix nach dem durchlaufend es konstruktors der anderen klasse dierekt wieder gelöscht. da das nicht beabsichtigt war, hab ich den pointe auch nicht auf null gesetzt^^
Quabla ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:20 Uhr.


Sitemap

().