Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите с деструктором 
:(
    Опции темы
tilser
Дата 30.1.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



имеется класс
Код

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 
PM MAIL   Вверх
MAKCim
Дата 30.1.2007, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



tilser, 
определи
operator(const matrix&)
operator=(const matrix&)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Anikmar
Дата 30.1.2007, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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


PM MAIL ICQ   Вверх
KelTron
Дата 30.1.2007, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: нет
Всего: 38



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

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, а заполняешь как для с еслементов.


Это сообщение отредактировал(а) KelTron - 30.1.2007, 14:06


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Xenon
Дата 30.1.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Вроде так
Код

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



--------------------
user posted image  
PM MAIL   Вверх
Rockie
Дата 30.1.2007, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 8
Всего: 31



В твоем случае матрица квадратная:
Код

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





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
tilser
Дата 31.1.2007, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 30.1.2007

Репутация: нет
Всего: нет



спасибо, понял, в чем ошибка.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.