myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   c++ segfault im destruktor (https://mygully.com/showthread.php?t=2970740)

Quabla 05.07.13 14:43

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?

inselberg 05.07.13 15:20

kein rows definiert im 2. teil...

Quabla 05.07.13 15:42

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^^

germgerm 08.07.13 08:38

Deine Snippets sehen für mich soweit gut aus.
Wie hast du DimensionError deklariert?
Welchen Compiler/OS verwendest du?

Quabla 08.07.13 10:22

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 08.07.13 11:06

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.

germgerm 08.07.13 11:25

Und deswegen Pointer immer 0 setzen und vor dem delete abfragen :)

Quabla 08.07.13 13:23

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^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:50 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.