Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. Memoy leak using QtCharts
Forum Updated to NodeBB v4.3 + New Features

Memoy leak using QtCharts

Scheduled Pinned Locked Moved Unsolved General and Desktop
30 Posts 10 Posters 6.0k Views 5 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    kuzulis
    Qt Champions 2020
    wrote on last edited by kuzulis
    #7

    @aawawa said in Memoy leak using QtCharts:

    hahahhabut by the way. I want to understand here why it doesn't work in this case!

    I'm too tried to use QtCharts and too faced with a memory leaks and etc.. I spat on QtCharts and replaced it with Qwt. (Because I haven't time to understand why QtCharts does not work as expected.. This was in Qt 5.9, as I remember).

    kshegunovK 1 Reply Last reply
    0
    • K kuzulis

      @aawawa said in Memoy leak using QtCharts:

      hahahhabut by the way. I want to understand here why it doesn't work in this case!

      I'm too tried to use QtCharts and too faced with a memory leaks and etc.. I spat on QtCharts and replaced it with Qwt. (Because I haven't time to understand why QtCharts does not work as expected.. This was in Qt 5.9, as I remember).

      kshegunovK Offline
      kshegunovK Offline
      kshegunov
      Moderators
      wrote on last edited by
      #8

      @kuzulis said in Memoy leak using QtCharts:

      I spat on QtCharts and replaced it with Qwt. (Because I haven't time to unterstand why QtCharts does not work as expected.. This was in Qt 5.9, as I remember).

      It hasn't improved since then. I did the same as you but picked QCustomPlot instead.

      Read and abide by the Qt Code of Conduct

      1 Reply Last reply
      0
      • A Offline
        A Offline
        aawawa
        wrote on last edited by
        #9

        @Christian-Ehrlicher : please find a micro project here : link text

        @mrjj : if I comment as this :

        //SerieToAdd->append(i, sin(static_cast<double>(i) * 3.14*2
        

        I have always the memory leak but it seems to be less important (around 6ko)

        mrjjM 1 Reply Last reply
        0
        • A aawawa

          @Christian-Ehrlicher : please find a micro project here : link text

          @mrjj : if I comment as this :

          //SerieToAdd->append(i, sin(static_cast<double>(i) * 3.14*2
          

          I have always the memory leak but it seems to be less important (around 6ko)

          mrjjM Offline
          mrjjM Offline
          mrjj
          Lifetime Qt Champion
          wrote on last edited by
          #10

          @aawawa
          Ok so it does seems related to the series.
          If you want to dig into it, you can very handy browse code here
          https://code.woboq.org/qt5/

          Super with sample.

          1 Reply Last reply
          1
          • A Offline
            A Offline
            aawawa
            wrote on last edited by
            #11

            @mrjj I 'm going to take a look to your link. Is it a database or you want me to send my code there?

            mrjjM 1 Reply Last reply
            0
            • A aawawa

              @mrjj I 'm going to take a look to your link. Is it a database or you want me to send my code there?

              mrjjM Offline
              mrjjM Offline
              mrjj
              Lifetime Qt Champion
              wrote on last edited by
              #12

              @aawawa
              Hi
              Its a code browser. it makes it really easy to see what is being used. all call to functions are links and
              its almost as good as the debugger. at least to see what is going on.
              I was thinking you would go and look how it deletes the series or something like that.
              The sample is for Christian-Ehrlicher as he might make it into a bug report if we can
              reproduce it and find no good reason for not release the mem on RemoveAllSeries.

              1 Reply Last reply
              1
              • Christian EhrlicherC Online
                Christian EhrlicherC Online
                Christian Ehrlicher
                Lifetime Qt Champion
                wrote on last edited by
                #13

                I can see some kind of 'leak' but need to do some more investigations.

                Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                Visit the Qt Academy at https://academy.qt.io/catalog

                1 Reply Last reply
                2
                • Christian EhrlicherC Online
                  Christian EhrlicherC Online
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #14

                  Ok, no leak there. Just a lot of data. You're creating 100000 QLineSeries with 10000 each - this will need some memory and time. I would rather try to add the points to one QLineSeries.

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  1 Reply Last reply
                  1
                  • A Offline
                    A Offline
                    aawawa
                    wrote on last edited by
                    #15

                    @Christian-Ehrlicher thank you... But it is supposed to be deleted 100000 times in my case no when I use RemoveAllSeries no?

                    1 Reply Last reply
                    0
                    • A Offline
                      A Offline
                      aawawa
                      wrote on last edited by
                      #16

                      @Christian-Ehrlicher would rather try to add the points to one QLineSeries this strategy works quiet well.
                      By changing y program as this for the header :

                      class MyChartView:public QChartView
                      {
                      public:
                      	MyChartView();
                      	~MyChartView();
                      	void Draw(void);
                      
                      private:	
                      	QLineSeries *mSeries;
                      };
                      

                      and for the .cpp

                      MyChartView::MyChartView()
                      {
                      
                      	mSeries = new QLineSeries;
                      	chart()->addSeries(mSeries);
                      
                      }
                      
                      
                      MyChartView::~MyChartView()
                      {
                      }
                      
                      void MyChartView::Draw(void)
                      {
                      	int Length = 1000;
                      	mSeries->clear();
                      	for (int i = 0; i < Length; i++)
                      	{
                      		mSeries->append(QPoint (i, sin(2 * i*3.141516*0.1)));
                      	}
                      	//update();
                      
                      }
                      
                      

                      It seems (I have to confirm this point later) to not have anymore memory leak

                      1 Reply Last reply
                      1
                      • Christian EhrlicherC Online
                        Christian EhrlicherC Online
                        Christian Ehrlicher
                        Lifetime Qt Champion
                        wrote on last edited by
                        #17

                        @aawawa said in Memoy leak using QtCharts:

                        But it is supposed to be deleted 100000 times in my case no when I use RemoveAllSeries no?

                        You're right. I think I found the culprit:

                        qlineseries.cpp:112
                        
                        QLineSeries::QLineSeries(QObject *parent)
                            : QXYSeries(*new QLineSeriesPrivate(this), parent)
                        

                        this is never deleted... :/

                        Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                        Visit the Qt Academy at https://academy.qt.io/catalog

                        JonBJ 1 Reply Last reply
                        3
                        • Christian EhrlicherC Christian Ehrlicher

                          @aawawa said in Memoy leak using QtCharts:

                          But it is supposed to be deleted 100000 times in my case no when I use RemoveAllSeries no?

                          You're right. I think I found the culprit:

                          qlineseries.cpp:112
                          
                          QLineSeries::QLineSeries(QObject *parent)
                              : QXYSeries(*new QLineSeriesPrivate(this), parent)
                          

                          this is never deleted... :/

                          JonBJ Offline
                          JonBJ Offline
                          JonB
                          wrote on last edited by
                          #18

                          @Christian-Ehrlicher
                          I think this is the second time I've seen that *new cause this. When will people decide that C++ is getting too clever for its boots? ;-)

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by SGaist
                            #19

                            Hi,

                            @Christian-Ehrlicher said in Memoy leak using QtCharts:

                            QLineSeriesPrivate

                            It's QObject based, so when the QXYSeries object is deleted it should also get deleted.

                            It's indeed QObject based but stored in a QScopedPointer so it will automatically get delete on object's destruction.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            1
                            • A Offline
                              A Offline
                              aawawa
                              wrote on last edited by
                              #20

                              @Christian-Ehrlicher Thank you. It's the first time I see *new in c++ what does it mean?

                              mrjjM 1 Reply Last reply
                              0
                              • A aawawa

                                @Christian-Ehrlicher Thank you. It's the first time I see *new in c++ what does it mean?

                                mrjjM Offline
                                mrjjM Offline
                                mrjj
                                Lifetime Qt Champion
                                wrote on last edited by
                                #21

                                @aawawa
                                Hi
                                Its a Dereference
                                http://www.cplusplus.com/doc/tutorial/pointers/
                                See section Dereference operator (*)

                                1 Reply Last reply
                                0
                                • A Offline
                                  A Offline
                                  aawawa
                                  wrote on last edited by
                                  #22

                                  @mrjj yes... I understand... But I don't understand the location of the asterix (*). I am used for example to write

                                  int *a = new int;
                                  

                                  what does

                                  *new int
                                  

                                  means?

                                  mrjjM 1 Reply Last reply
                                  0
                                  • A aawawa

                                    @mrjj yes... I understand... But I don't understand the location of the asterix (*). I am used for example to write

                                    int *a = new int;
                                    

                                    what does

                                    *new int
                                    

                                    means?

                                    mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by mrjj
                                    #23

                                    @aawawa
                                    Means
                                    value pointed to by ptr
                                    The actual value.

                                    int copy = *SomeIntPtr;
                                    that will copy the value to the copy var.
                                    if you did
                                    int copy = SomeIntPtr;
                                    you get the address of pointer into copy

                                    1 Reply Last reply
                                    0
                                    • Christian EhrlicherC Online
                                      Christian EhrlicherC Online
                                      Christian Ehrlicher
                                      Lifetime Qt Champion
                                      wrote on last edited by
                                      #24

                                      Ok, no memleak at all. You testcase is wrong / inaccurate.
                                      The problem with your testcase is that your eventloop is not (yet) running and that you also call it in an loop without a chance for the eventloop to do it's work. Since the internals of QLineSeries is cleaned up with a deferred delete it is not cleaned up until the eventloop is called (and after app.exec()). That's also the reason I thought the dtor is not called at all.

                                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                                      Visit the Qt Academy at https://academy.qt.io/catalog

                                      1 Reply Last reply
                                      3
                                      • J Offline
                                        J Offline
                                        JosuGZ
                                        wrote on last edited by JosuGZ
                                        #25

                                        @Christian-Ehrlicher said in Memoy leak using QtCharts:

                                        Ok, no memleak at all. You testcase is wrong / inaccurate.
                                        The problem with your testcase is that your eventloop is not (yet) running and that you also call it in an loop without a chance for the eventloop to do it's work. Since the internals of QLineSeries is cleaned up with a deferred delete it is not cleaned up until the eventloop is called (and after app.exec()). That's also the reason I thought the dtor is not called at all.

                                        It seems to me that there are some memory leaks happening here.

                                        This code increases memory usage continuously:

                                        aSeries->remove(aSeries->points().size() - 1);
                                        aSeries->append(timestamp, mean);

                                        Bit this one does not:

                                        aSeries->replace(aSeries->points().size() - 1, timestamp, mean);

                                        I'm using Qt 5.11.2.

                                        JonBJ J.HilkJ 2 Replies Last reply
                                        0
                                        • J JosuGZ

                                          @Christian-Ehrlicher said in Memoy leak using QtCharts:

                                          Ok, no memleak at all. You testcase is wrong / inaccurate.
                                          The problem with your testcase is that your eventloop is not (yet) running and that you also call it in an loop without a chance for the eventloop to do it's work. Since the internals of QLineSeries is cleaned up with a deferred delete it is not cleaned up until the eventloop is called (and after app.exec()). That's also the reason I thought the dtor is not called at all.

                                          It seems to me that there are some memory leaks happening here.

                                          This code increases memory usage continuously:

                                          aSeries->remove(aSeries->points().size() - 1);
                                          aSeries->append(timestamp, mean);

                                          Bit this one does not:

                                          aSeries->replace(aSeries->points().size() - 1, timestamp, mean);

                                          I'm using Qt 5.11.2.

                                          JonBJ Offline
                                          JonBJ Offline
                                          JonB
                                          wrote on last edited by
                                          #26

                                          @JosuGZ
                                          In the last post 4 months ago made by @Christian-Ehrlicher, he explained that memory would only be recovered (and hence [hopefully] not permanently grow) when the OP allowed his code to reach the main event loop. I don't know how replace works, but remove surely will do a deferred delete. So in your example you need to be clear/show us how your code hits the event loop each time after do the remove/append?

                                          1 Reply Last reply
                                          1

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved