Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2013, 15:31   #21
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
если не ошибаюсь, то деструкторы прописывать не надо. так как QT сделает все сам, если удаляется главное окно
ошибаешься.
Каждый объект Qt хранит ссылки на дочерние элементы в деструкторе уничтожает их. На этом сборка мусора заканчивается.
rrrFer вне форума Ответить с цитированием
Старый 16.01.2013, 15:32   #22
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Может поэтому в С++ можно и не освобождать память от matrix[][] при завершении приложения... и ничего страшного не будет
будет страшно, если твоя программа будет долго работать и постоянно создавать экземпляры LoadMatrixMainWindow.
rrrFer вне форума Ответить с цитированием
Старый 16.01.2013, 20:05   #23
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
в деструктор напиши
Если я так пишу:

loadmatrixmainwindow.h
Код:
public:
    ~LoadMatrixMainWindow();
loadmatrixmainwindow.cpp
Код:
LoadMatrixMainWindow::~LoadMatrixMainWindow()
{
    for (int i = 0; i < nrows; i++) {
        delete [] matrix[i];
    }
    delete [] matrix;
}
То появляется ошибка, когда закрываю приложение:
8Observer8 вне форума Ответить с цитированием
Старый 16.01.2013, 20:10   #24
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Понял почему. Матрицу нужно в кострукторе окна создавать. Но ведь до загрузки я не знаю размер.... В общем думать нужно. Сейчас не соображу, но проблему понял.
8Observer8 вне форума Ответить с цитированием
Старый 16.01.2013, 20:32   #25
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Вот такое решение придумал. Инициализировать размеры матрицы в конструкторе окна.

Код:
LoadMatrixMainWindow::LoadMatrixMainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    nrows = 2;
    ncols = 2;

    matrix = new double *[nrows];
    for (int i = 0; i < nrows; i++) {
        matrix[i] = new double[ncols];
    }
}
Сейчас нормально работает.
8Observer8 вне форума Ответить с цитированием
Старый 17.01.2013, 09:27   #26
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Понял почему. Матрицу нужно в кострукторе окна создавать. Но ведь до загрузки я не знаю размер.... В общем думать нужно.
не обязательно всю память в конструкторе выделять.
rrrFer вне форума Ответить с цитированием
Старый 17.01.2013, 10:08   #27
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
не обязательно всю память в конструкторе выделять.
Поясните, пожалуйста, я не понял

Я такую ошибку грубую совершил! Я же память по минимуму выделил сейчас 2x2. А если я матрицу 10x10 считаю из файла

Решение такое. Нужно перед заполнением матрицы из файла, удалить матрицу выделенную в конструкторе (поумолчанию 2x2). И заново выделить память требуемого размера (размер указан в файле).
8Observer8 вне форума Ответить с цитированием
Старый 17.01.2013, 18:19   #28
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
Нужно перед заполнением матрицы из файла, удалить матрицу выделенную в конструкторе (поумолчанию 2x2).
тебе в конструкторе обязательно что-то выделять? ) Насколько я тебя понимаю, ты выделяешь ее чтобы потом освободить (другой цели нет).

кстати, ты можешь использовать вектор чтобы избежать утечек.
rrrFer вне форума Ответить с цитированием
Старый 17.01.2013, 18:32   #29
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

долго не мог понять что за таинственная проблема тебя преследует. Посмотрел твой код и кажется догадался.

Тебя смущает что ты выделяешь память в loadMatrixFromXmlFile, но это нормально.

Если память можно сразу освободить - освобождай и сократи области видимости своих массивов (эти массивы по-любому не должны быть свойством класса).

Освобождать память в деструкторе тебе смысла нет. Он вызывается 1 раз при уничтожении объекта, но за время жизни объекта метод loadMatrixFromXmlFile может быть вызван несколько раз, при этом ты будешь получать утечки (если не освободишь там же память).

Сообщение об ошибке (которые ты выше привел) получаешь, наверное, когда метод loadMatrixFromXmlFile не вызывается ниразу (при этом память не выделяется вообще) и при попытки освободить ее ты можешь такое получить.

Ты можешь пересмотреть архитектуру и объявлять массивы внутри функции, перед возвратом из нее освобождай память.

Ты можешь использовать динамические списки вместо массивов это гораздо удобнее.

Последний раз редактировалось rrrFer; 17.01.2013 в 18:33. Причина: орфография
rrrFer вне форума Ответить с цитированием
Старый 17.01.2013, 20:30   #30
8Observer8
Старожил
 
Регистрация: 02.01.2011
Сообщений: 3,328
По умолчанию

Цитата:
Сообщение от rrrFer Посмотреть сообщение
тебе в конструкторе обязательно что-то выделять? ) Насколько я тебя понимаю, ты выделяешь ее чтобы потом освободить (другой цели нет).
При нажатии на кнопку появляется диалог открытия файла. Выбираем файл. В файле размер матрицы и её элементы. После того, как файл выбран, срабатывает функция, которая инициализирует matrix.

Если я создам множество объектов 'LoadMatrixMainWindow' ничего страшного не будет, так как для каждого из них будет вызван деструктор

Вот как ситуация выглядит на данный момент:

- в конструкторе создаётся двумерный динамический массив matrix[][] c размером 2x2 (nrows x ncols)

- при нажатии на кнопку:

1) удаляется массив matrix[][] размера nrows x ncols

2) из файла читаются размеры матрицы: nrows и ncols. Выделяется память для массива matrix[][]. Элементы матрицы инициализируются из файла

- когда мы опять нажимаем кнопку - случаются события 1) и 2)

- когда мы закрываем приложение, то срабатывает деструктор, который освобождает память от массива matrix[][]

Вот фрагменты из кода, которые демонстрируют описанное выше:

Код:
LoadMatrixMainWindow::LoadMatrixMainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    ...

    nrows = 2;
    ncols = 2;

    matrix = new double *[nrows];
    for (int i = 0; i < nrows; i++) {
        matrix[i] = new double[ncols];
    }

    ...
}
Следующая функция срабатывает, когда мы нажимаем на кнопку "загрузить матрицу"

Код:
bool LoadMatrixMainWindow::loadMatrixFromXmlFile(QString filename)
{
    // запускаем диалог открытия файла
    ...

    // удаляем массив matrix[][]
    for (int i = 0; i < nrows; i++) {
        delete [] matrix[i];
    }
    delete [] matrix;

    // инициализируем из файла размеры матрицы nrows и ncols
    nrows = ...
    ncols = ...

    // выделяем память для матрицы
    matrix = new double *[nrows];
    for (int i = 0; i < nrows; i++) {
        matrix[i] = new double[ncols];
    }

    // заполняем матрицу из файла
    ...

    // заполняем элемент GUI QTableWidget
    ...
}
Код:
LoadMatrixMainWindow::~LoadMatrixMainWindow()
{
    for (int i = 0; i < nrows; i++) {
        delete [] matrix[i];
    }
    delete [] matrix;
}

Последний раз редактировалось 8Observer8; 17.01.2013 в 20:33.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что лучше использовать? Lindemann66 C/C++ Базы данных 11 01.09.2011 10:21
3d графики: что вообще есть и что лучше использовать Krasi Общие вопросы по Java, Java SE, Kotlin 1 09.05.2011 14:41
MS рекомендует использовать AutoComplete в GUI Glen Свободное общение 0 04.04.2011 22:43
Обработка сигнала - что использовать? gooff Компьютерное железо 3 02.07.2008 12:13
Обработка сигнала - что использовать! gooff Помощь студентам 4 22.06.2008 20:57