Problem z wyciekiem pamięci przy QGraphicsScene.

0

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;
}
4
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;
}

użyj zamiast tego std::vector<int> i nie będziesz miał problemu.

std::vector<unsigned int> dane(int numbers)
{
    std::vector<unsigned int> returnData;

    for(auto i = 0; i < numbers; i++)
        returnData.push_back((i * numbers)% i);

    return returnData;
}

Tutaj zwrócenie wektora przez wartość będzie miało plus, ponieważ dla wektora zdefiniowany jest konstruktor przenoszący.

0

Chyba działa, dzięki ;D
Zrobiłem jeszcze coś takiego

m_chart->removeAllSeries();

zamiast

m_chart = new QChart;

I wszystko działa poprawnie, dane się zmieniają i ładnie wyświetlają, tylko co jakiś czas konsola wypluwa:

QGraphicsScene::addItem: item has already been added to this scene

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0