Russian Qt Forum

Программирование => С/C++ => Тема начата: starter от Сентябрь 08, 2009, 22:02



Название: Oшибка new delete
Отправлено: starter от Сентябрь 08, 2009, 22:02
Пишу
Код:
typedef struct {
    QSet<QString> vFi;
    QVector<QString> symbols;
} tprd;
typedef struct {   
    QString fsy;
    tprd prd;
} mrule;
mrule **M;

//new
   M = new mrule*[rows];  //выделение памяти для таблицы предикативного анализатора
   for(int i = 0; i < cols; ++i)
       M[i] = new mrule[cols];
//delete
    for(int i = 0; i < cols; ++i) {
        M[i]->prd.symbols.clear();
        M[i]->prd.vFi.clear();
        if( M[i] != NULL )
            delete [] M[i];
    }
    delete M;  //delete [] M;

Выполнение последней строки приводит к ошибке.
В чем моя ошибка?


Название: Re: Oшибка new delete
Отправлено: BRE от Сентябрь 08, 2009, 22:29
Выполнение последней строки приводит к ошибке.
В чем моя ошибка?
А что между выделением/освобождением находиться?


Название: Re: Oшибка new delete
Отправлено: starter от Сентябрь 09, 2009, 01:02
Между в двойном цикле
Код:
M[ivn][ivt].fsy = rule.fsy;
M[ivn][ivt].prd = prd;

Переформулирую вопрос. Как правильно освободить память в данном случае?


Название: Re: Oшибка new delete
Отправлено: BRE от Сентябрь 09, 2009, 07:35
Код рабочий.

Пробуем:
Код
C++ (Qt)
#include <QApplication>          
#include <QSet>                  
#include <QVector>              
 
typedef struct
{
       QSet<QString> vFi;
       QVector<QString> symbols;
} tprd;
 
typedef struct
{
       QString fsy;
       tprd prd;
} mrule;
 
const int rows = 10;
const int cols = 10;
 
int main( int /*argc*/, char */*argv*/[] )
{
       mrule **M;
 
       //new
       M = new mrule*[rows];  //выделение памяти для таблицы предикативного анализатора
       for(int i = 0; i < cols; ++i)
               M[i] = new mrule[cols];
 
       //delete
       for(int i = 0; i < cols; ++i)
       {
               M[i]->prd.symbols.clear(); // Можно не делать
               M[i]->prd.vFi.clear(); // Очистка пройдет в деструкторе
               delete[] M[i];
}
delete[] M;  //delete [] M;
 
       return 0;
}
 

У меня проблем не возникло.


Название: Re: Oшибка new delete
Отправлено: Alex Custov от Сентябрь 09, 2009, 20:25
Бьётся память где-нибудь в другом месте, из-за чего совершенно корректные операции с памятью могут вылетать. Используй специальные утилиты типа valgrind, чтобы найти где проблема.


Название: Re: Oшибка new delete
Отправлено: KADABRA от Сентябрь 10, 2009, 11:00
Цитировать
M = new mrule*[rows];
Цитировать
        for(int i = 0; i < cols; ++i)
                M[i] = new mrule[cols];
Как уже сказали - тут идёт выход за пределы массива - это и есть источник беды.


Название: Re: Oшибка new delete
Отправлено: starter от Сентябрь 11, 2009, 23:41
Спасибо за вашу внимательность.

Код
C++ (Qt)
//new
  M = new mrule*[rows];  //выделение памяти для таблицы предикативного анализатора
  for(int i = 0; i < rows; ++i)
      M[i] = new mrule[cols];
//delete
   for(int i = 0; i < rows; ++i) {
       delete [] M[i];
   }
   delete [] M;