Witam,
Pisząc swoją klasę napotkałem na drobny wyciek pamięci, w sumie spowodowany moją nieuwagą.
Mam taką klasę
class Okno : public QMainWindow
{
Q_OBJECT
public:
explicit OknoQWidget *parent = 0);
~Okno();
private slots:
void draw();
void on_ButtonStart_clicked();
void on_ButtonExit_clicked();
private:
Ui::Okno *ui;
QGraphicsScene *scene;
QChart *m_chart;
QTimer *timer;
};
Generuję sobie losowe danne i chcę je jakoś wyświetlać na ekranie.
Pierwsza wersja mojej funkcji działa normalnie lecz powoduje generowanie dodatkowych "śmieci".
void Okno::draw()
{
m_chart = new QChart; //to zapewne generuje śmieci
m_chart->setMinimumSize(721, 301);
m_chart->setMaximumSize(721, 301);
m_chart->legend()->hide();
QSplineSeries *series = new QSplineSeries;
unsigned short x = 1000;
unsigned int *source = dane(x);
if(source != NULL)
{
for(int i=18; i<x; i++)
{
series->append(0.001*i, source[i]);
}
delete[] source;
}
else
std::cout << "data not found\n";
m_chart->addSeries(series);
m_chart->createDefaultAxes();
m_chart->setAcceptHoverEvents(true);
scene->addItem(m_chart);
}
Lecz jeżeli nie chcę zbędnie tworzyć co chwilę nowego m_charta i tylko czyścić przed wyświetleniem scenę to wyskakuje mi błąd:
Podproces zatrzymany, ponieważ otrzymał on sygnał z systemu operacyjnego.
Nazwa sygnału: SIGSEGV
Znaczenie sygnału: Segmentation fault
W takim dziwnym miejscu w qgraphicslayoutitem.h
inline void QGraphicsLayoutItem::setMinimumSize(qreal aw, qreal ah)
{ setMinimumSize(QSizeF(aw, ah)); }//dokładnie w tym miejscu
void Okno::draw()
{
scene->clear();
//m_chart = new QChart;
m_chart->setMinimumSize(721, 301);
m_chart->setMaximumSize(721, 301);
m_chart->legend()->hide();
QSplineSeries *series = new QSplineSeries;
unsigned short x = 1000;
unsigned int *source = dane(x);
if(source != NULL)
{
for(int i=18; i<x; i++)
{
series->append(0.001*i, source[i]);
}
delete[] source;
}
else
std::cout << "data not found\n";
m_chart->addSeries(series);
m_chart->createDefaultAxes();
m_chart->setAcceptHoverEvents(true);
scene->addItem(m_chart);
}
//losowe dane
unsigned int *dane(int numbers)
{
int rozm = numbers;
unsigned int *returnData = new unsigned int[numbers];
for(int i=0; i<numbers; i++)
returnData[i] = (i*numbers)%i;
return returnData;
}