Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > помогите с деструктором


Автор: tilser 30.1.2007, 11:22
имеется класс
Код

class matrix 
   { 
      int MRows; 
      int MColumns; 
      double **M; 
   public: 
      int Rows() 
         { 
            return MRows; 
         } 
      int Columns() 
         { 
            return MColumns; 
         } 
      matrix(int r, int c) 
         { 
            MRows = r; 
            MColumns = c; 
            M = new double *[r]; 
            for (int i = 0; i < MColumns; i ++) 
               M[i] = new double[r]; 
         } 
      double & operator()(int r, int c) 
      { 
         return M[r - 1][c - 1]; 
      }

по логике вещей деструктор должен быть такой
Код

~matrix() 
{ 
for (int i = 0; i < MColumns; i ++) 
  delete [] M[i]; 
 delete [] M; 
}

но иногда при выходе из программы вылетает ошибка: 
"Access violation reading location 0xfeeefee2." 
отслеживая в дебагере стновится ясно, что это имненно из-за деструктора
кто может подсказать в чем проблема smile 
заранее спасибо smile 

Автор: MAKCim 30.1.2007, 11:29
tilser, 
определи
operator(const matrix&)
operator=(const matrix&)

Автор: Anikmar 30.1.2007, 11:56
Цитата(tilser @  30.1.2007,  11:22 Найти цитируемый пост)
            for (int i = 0; i < MColumns; i ++) 
               M[i] = new double[r  // <----- Вот здесь точно r а не с?,]; 


Автор: KelTron 30.1.2007, 13:57
По логике вещей конструктор должен быть такой:
Код

matrix(int r, int c) 
{ 
            MRows = r; 
            MColumns = c; 
            M = new double *[MRows]; 
            for (int i = 0; i < MRows; i++) 
               M[i] = new double[MColumns]; 
} 

а деструктор соответственно:
Код

~matrix() 
{ 
   for (int i = 0; i < MRows; i++) 
       delete [] M[i]; 
   delete [] M; 
}

У тебя получается, что ты выделяешь память под r елементов для массива M, а заполняешь как для с еслементов.

Автор: Xenon 30.1.2007, 20:40
Вроде так
Код

class matrix 
{
    int MRows; 
    int MColumns; 
    double **M; 
public:
    int Rows() 
    {
        return MRows; 
    }
    int Columns() 
    { 
        return MColumns; 
    } 
    matrix(int r, int c) 
    {
        MRows = r; 
        MColumns = c; 
        M = new double *[r]; 
        for (int i = 0; i < MColumns; i++) 
        {
            M[i] = new double[MColumns]; 
        }
    }
     double& operator()(int r, int c) 
     { 
      return M[r - 1][c - 1]; 
     }
    // matrix():M(NULL) {}
     ~matrix() 
     {
         //if (M!=NULL)
         //{
           for (int i = 0; i < MRows; i++) 
           {
               delete [] M[i]; 
           }
           delete [] M; 
         //}
     }
};

Автор: Rockie 30.1.2007, 21:44
В твоем случае матрица квадратная:
Код

      matrix(int r, int c) 
         { 
            MRows = r; 
            MColumns = c; 
            M = new double *[r]; 
            for (int i = 0; i < MColumns; i ++) 
               M[i] = new double[r]; 
         } 


корректно так:
Код

      matrix(int r, int c) 
         { 
            MRows = r; 
            MColumns = c; 
            M = new double *[MRows]; 
            for (int i = 0; i < MRows; i ++) 
               M[i] = new double[MColumns]; 
         } 


в деструторе тоже ошибка, ты ведь сначала выделяешь память под строки:

Код

~matrix() 
{ 
for (int i = 0; i < MRows; i ++) 
  delete [] M[i];    
 delete [] M;        
}



Автор: tilser 31.1.2007, 11:19
спасибо, понял, в чем ошибка.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)