Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: dimbor от Август 16, 2017, 14:50



Название: Проблемы с qwtplotmarker
Отправлено: dimbor от Август 16, 2017, 14:50
Доброго времени суток.

Писал программу, выводяющую векторную диаграмму на график. При создании векторной диаграммы использовал массив qwtplotmarker'ов:
Код:
QwtPlotMarker markers_array[1024];

На графике все 1024 точки отображаются прекрасно. Но возникает проблема при закрытии программы - постоянно вылетает ошибка памяти, как будто  все указатели на маркеры теряются и он не может их удалить. Да и когда я пытаюсь сделать detach, никакой реакции не происходит. Собственно вопрос - каким образом нужно правильно удалять весь массив маркеров?


Название: Re: Проблемы с qwtplotmarker
Отправлено: gil9red от Август 16, 2017, 16:20
Интересно, а если закрывать программу через qApp->quit() (главное не забыть #include <QApplication>) ошибка тоже будет? :D


Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 16, 2017, 16:36
Вызов delete с передачей указателя на QwtPlotMarker в деструкторе QwtPlot


Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 16, 2017, 16:47
Предлагаю в деструкторе QwtPlot наследника вызывать detachItems (http://qwt.sourceforge.net/class_qwt_plot_dict.html#acb2e402e05c693433ed7e84696fbdfc0) (QwtPlotItem::Rtti_PlotMarker (http://qwt.sourceforge.net/class_qwt_plot_item.html#ab149ac85e233ce9cedf2f2f2af871bf3af1fb53ddb320ecbf2bba00a323cf08ff), false);


Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 16, 2017, 16:50
Ещё можно перед вызовом ~QwtPlot() пробежаться по массиву маркеров и для каждого вызвать detach (http://qwt.sourceforge.net/class_qwt_plot_item.html#ab2bbee6dbe36a5f1d0ce853ac66716a6). Имхо, так даже правильнее будет.


Название: Re: Проблемы с qwtplotmarker
Отправлено: dimbor от Август 16, 2017, 17:06
Ещё можно перед вызовом ~QwtPlot() пробежаться по массиву маркеров и для каждого вызвать detach (http://qwt.sourceforge.net/class_qwt_plot_item.html#ab2bbee6dbe36a5f1d0ce853ac66716a6). Имхо, так даже правильнее будет.

В деструкторе плота? Для этого, получается, надо переопределять весь график? Или как-то можно до него добраться, если он в дизайнере объявлен?


Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 17, 2017, 09:08
В деструкторе класса, который хранит markers_array[1024];



Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 17, 2017, 09:10
Есть ещё вариант создавать экземпляры в динамической памяти с помощью оператора new. Тогда ответственность за освобождение памяти будет у QwtPlot при связывании маркеров с ним.


Название: Re: Проблемы с qwtplotmarker
Отправлено: dimbor от Август 17, 2017, 16:39
К сожалению, описанные способы не помогли. Ошибка каждый раз вылетает в этом месте:
Код:
    ~PrivateData()
    {
#ifndef QWT_NO_SVG
        delete svg.renderer;
#endif
    }

Перепробовал все, включая и создание при помощи new. Ошибка продолжает упорно действовать на нервы.


Название: Re: Проблемы с qwtplotmarker
Отправлено: __Heaven__ от Август 17, 2017, 21:28
Выложите минимальный компилябельный проект