Russian Qt Forum
Ноябрь 23, 2024, 21:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Oшибка new delete  (Прочитано 4904 раз)
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;

Выполнение последней строки приводит к ошибке.
В чем моя ошибка?
Записан
BRE
Гость
« Ответ #1 : Сентябрь 08, 2009, 22:29 »

Выполнение последней строки приводит к ошибке.
В чем моя ошибка?
А что между выделением/освобождением находиться?
Записан
starter
Гость
« Ответ #2 : Сентябрь 09, 2009, 01:02 »

Между в двойном цикле
Код:
M[ivn][ivt].fsy = rule.fsy;
M[ivn][ivt].prd = prd;

Переформулирую вопрос. Как правильно освободить память в данном случае?
Записан
BRE
Гость
« Ответ #3 : Сентябрь 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;
}
 

У меня проблем не возникло.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #4 : Сентябрь 09, 2009, 20:25 »

Бьётся память где-нибудь в другом месте, из-за чего совершенно корректные операции с памятью могут вылетать. Используй специальные утилиты типа valgrind, чтобы найти где проблема.
« Последнее редактирование: Сентябрь 09, 2009, 20:27 от AX » Записан
KADABRA
Гость
« Ответ #5 : Сентябрь 10, 2009, 11:00 »

Цитировать
M = new mrule*[rows];
Цитировать
        for(int i = 0; i < cols; ++i)
                M[i] = new mrule[cols];
Как уже сказали - тут идёт выход за пределы массива - это и есть источник беды.
Записан
starter
Гость
« Ответ #6 : Сентябрь 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;
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.162 секунд. Запросов: 23.