Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Memory Leak in Qt 4.10.0



  • HI All,

    I am getting memory leak in my c++ code written in Qt 4.10.0.
    I am not Sure where the leak is.
    I correct few things like doing cleanup whenever using setFont. Also confirmed that all dynamic memory allocations are getting cleaned in destructor.
    Now I am not ure where the issue is. Could you please help me with how I can detect memory leak.

    Thanks
    Nitin



  • @ndiwan
    Use valgrind to detect memory leakages.


  • Moderators

    @ndiwan there is no such thing as Qt 4.10.0



  • Thanks For Reply.
    valgrind_Qt.JPG bolded text

    Attached is the valgrid plugin in my Qt creator. Do I need to use this. Sorry but I am new in Qt.
    It say External Application.

    Thanks


  • Lifetime Qt Champion

    @ndiwan said in Memory Leak in Qt 4.10.0:

    Do I need to use this.

    Yes, the "Valgrind Memory Analyzer"



  • Thanks.
    Do you find any issue here relelated to memory leak in my paintEvent:

    void CSkateRetarder::paintEvent(QPaintEvent * )
    {
        QPainter painter(this);
        painter.setRenderHint(QPainter::Antialiasing);
        QPainterPath m_SelectedPath = QPainterPath();
        m_SelectedPath.addRect(0,0, getRectWidth()+10, getRectHeight()+10);
        QPen pen = QPen(m_qcRetarderColor,2);
        QFont::cleanup();
        QFont font("Arial", 10);
        font.setBold(true);
        painter.setFont(font);
        painter.setPen(pen);
    
        if(m_state == SKATE_POS_OPEN || m_state == SKATE_POS_OOC_OPEN || (m_state == SKATE_POS_COMM_LOST && m_PrevState == -1) || m_PrevState == SKATE_POS_OPEN || m_PrevState == SKATE_POS_OOC_OPEN)
        {
            painter.setBrush(QBrush(Qt::transparent));
            QPainterPath path;
            path.addRoundedRect(QRectF(5, 5, getRectWidth(), getRectHeight()), 5, 5);
            painter.drawPath(path);
            painter.setBrush(QBrush(m_qcRetarderColor));
            QPainterPath upperCurve;
            upperCurve.moveTo(10, 5);
            upperCurve.lineTo(getRectWidth(), 5);
            upperCurve.lineTo(getRectWidth()-5, 10);
            upperCurve.lineTo(getRectWidth()-10, 5);
            upperCurve.lineTo(getRectWidth()-15, 10);
            upperCurve.lineTo(getRectWidth()-20, 5);
            upperCurve.lineTo(getRectWidth()-25, 10);
            upperCurve.lineTo(getRectWidth()-30, 5);
            upperCurve.lineTo(getRectWidth()-35, 10);
            upperCurve.lineTo(getRectWidth()-40, 5);
            upperCurve.lineTo(getRectWidth()-45, 10);
            upperCurve.lineTo(getRectWidth()-50, 5);
            painter.drawPath(upperCurve);
            QPainterPath lowerCurve;
            lowerCurve.moveTo(10, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth(), getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-5, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-10, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-15, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-20, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-25, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-30, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-35, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-40, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-45, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-50, getRectHeight()+5);
            painter.drawPath(lowerCurve);
            painter.setBackgroundMode(Qt::TransparentMode);
            painter.setPen(QPen(Qt::white, 2));
            painter.drawText(5,5, getRectWidth(), getRectHeight(), Qt::AlignHCenter | Qt::AlignVCenter, "OPEN");
        }
        else if(m_state == SKATE_POS_CLOSE || m_state == SKATE_POS_OOC_CLOSE || m_PrevState == SKATE_POS_CLOSE || m_PrevState == SKATE_POS_OOC_CLOSE)
        {
            painter.setBrush(QBrush(m_qcRetarderColor));
            QPainterPath path;
            path.addRoundedRect(QRectF(5, 10, getRectWidth(), getRectHeight()-10), 5, 5);
            painter.drawPath(path);
            painter.setBackgroundMode(Qt::TransparentMode);
            painter.setPen(QPen(Qt::white, 2));
            QPainterPath MiddleLine;
            MiddleLine.moveTo(5, getRectHeight()/2+5);
            MiddleLine.lineTo(10, getRectHeight()/2);
            MiddleLine.lineTo(15, getRectHeight()/2+10);
            MiddleLine.lineTo(20, getRectHeight()/2);
            MiddleLine.lineTo(25, getRectHeight()/2+10);
            MiddleLine.lineTo(30, getRectHeight()/2);
            MiddleLine.lineTo(35, getRectHeight()/2+10);
            MiddleLine.lineTo(40, getRectHeight()/2);
            MiddleLine.lineTo(45, getRectHeight()/2+10);
            MiddleLine.lineTo(50, getRectHeight()/2);
            MiddleLine.lineTo(55, getRectHeight()/2+10);
            MiddleLine.lineTo(60, getRectHeight()/2);
            MiddleLine.lineTo(65, getRectHeight()/2+5);
            painter.drawPath(MiddleLine);
        }
        else
        {
            painter.setBrush(QBrush(Qt::transparent));
            QPainterPath path;
            path.addRoundedRect(QRectF(5, 5, getRectWidth(), getRectHeight()), 5, 5);
            painter.drawPath(path);
            painter.setBrush(QBrush(m_qcRetarderColor));
            QPainterPath upperCurve;
            upperCurve.moveTo(10, 5);
            upperCurve.lineTo(getRectWidth(), 5);
            upperCurve.lineTo(getRectWidth()-5, 10);
            upperCurve.lineTo(getRectWidth()-10, 5);
            upperCurve.lineTo(getRectWidth()-15, 10);
            upperCurve.lineTo(getRectWidth()-20, 5);
            upperCurve.lineTo(getRectWidth()-25, 10);
            upperCurve.lineTo(getRectWidth()-30, 5);
            upperCurve.lineTo(getRectWidth()-35, 10);
            upperCurve.lineTo(getRectWidth()-40, 5);
            upperCurve.lineTo(getRectWidth()-45, 10);
            upperCurve.lineTo(getRectWidth()-50, 5);
            painter.drawPath(upperCurve);
            QPainterPath lowerCurve;
            lowerCurve.moveTo(10, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth(), getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-5, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-10, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-15, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-20, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-25, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-30, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-35, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-40, getRectHeight()+5);
            lowerCurve.lineTo(getRectWidth()-45, getRectHeight());
            lowerCurve.lineTo(getRectWidth()-50, getRectHeight()+5);
            painter.drawPath(lowerCurve);
            painter.setBackgroundMode(Qt::TransparentMode);
            painter.setPen(QPen(Qt::white, 2));
    
        }
        if(m_isHighlight)
        {
            painter.setBrush(Qt::transparent);
            painter.setPen(QPen(Qt::green,3));
            painter.drawPath(m_SelectedPath);
        }
        if(m_isPulse)
        {
            painter.setBrush(Qt::transparent);
            painter.setPen(QPen(Qt::yellow,3));
            painter.drawPath(m_SelectedPath);
        }
        QRect rect = m_SelectedPath.boundingRect().toRect();
        QRegion Mask(rect);
        setMask(Mask);
        QFont::cleanup();
        painter.end();
    }
    

    Edit: added code tags, to make it readable [jhilk]


  • Lifetime Qt Champion

    @ndiwan said in Memory Leak in Qt 4.10.0:

    m_SelectedPath.addRect(0,0, getRectWidth()+10, getRectHeight()+10);

    Do you ever remove rects from m_SelectedPath?



  • No. How to remove rect from QPainterPath ?

    Thanks


  • Lifetime Qt Champion

    @ndiwan Why do you actually add a rect each time paintEvent is called?


  • Moderators

    @ndiwan should actually not be necessary , m_SelectedPath is, despite its name, a local (scoped) variable:

    void CSkateRetarder::paintEvent(QPaintEvent * )
    {
       QPainter painter(this);
       painter.setRenderHint(QPainter::Antialiasing);
       QPainterPath m_SelectedPath = QPainterPath();
       m_SelectedPath.addRect(0,0, getRectWidth()+10, getRectHeight()+10);
    ...
    

    so it should get cleaned up when the function returns


  • Lifetime Qt Champion

    @J-Hilk Ah, you're right, didn't notice this.



  • I am drawing a rectangular widget. That's why addign rectangle. Did you still see any memory leakage related issue in paintEvent ?

    b4ed0abc-7f6f-463e-a0f9-35dc9ab9f05a-image.png

    Thanks


  • Lifetime Qt Champion

    @ndiwan said in Memory Leak in Qt 4.10.0:

    Did you still see any memory leakage related issue in paintEvent ?

    No
    Did you run Valgrind as suggested to find memory leaks?



  • Sorry, But I am not sure how to use that in Window Qt. I know ho to use valgrind in Linux

    664e751d-baa5-408f-b9a4-c36d0fd2e186-image.png

    001ebda1-77b7-4300-971e-9fc77764337b-image.png

    Actually my application runs with a login dialog. Do I need to provided user id and passoword in arguments here ?
    Also kit drop down is diable.

    Thanks


  • Lifetime Qt Champion

    @ndiwan said in Memory Leak in Qt 4.10.0:

    Do I need to provided user id and passoword in arguments here ?

    No

    "Also kit drop down is diable" - what do you mean?



  • Kit dropdown is disable.

    Thansks


  • Lifetime Qt Champion

    @ndiwan said in Memory Leak in Qt 4.10.0:

    Kit dropdown is disable

    This is the same what I asked about. Can you please explain what dropdown you mean? Maybe a screen-shot?



  • b19325b7-e01a-4bcb-b0c0-4aeeefc8247a-image.png

    In the above screenshot Kit combo dropdown is disable. If I click manage , I can see this:

    10ef1a27-cc0e-4834-8a40-c26bb764504e-image.png


  • Lifetime Qt Champion

    @ndiwan Do you have Valgrind? Check in Analyzer/Valgrind. You need to set the path to Valgrind executable.


  • Lifetime Qt Champion

    @jsulm Since when does valgrind run on windows?


  • Lifetime Qt Champion

    @Christian-Ehrlicher Ah, Windows. Well, since never :-)



  • So How I can check memory leakage in Qt Creator running on Windows 10 ?

    Thanks



  • @Christian-Ehrlicher said in Memory Leak in Qt 4.10.0:

    Since when does valgrind run on windows?

    I am the person who originally replied to @ndiwan 's "Could you please help me with how I can detect memory leak." with "Use valgrind to detect memory leakages."

    I read the question carefully and nowhere did it mention using Windows. One of my pet bug-bears is if questioners cannot tell you what OS they are on for a question of this kind, why should I guess they are under Windows? Other OS people tell you what they are on, why do Windows users think people ought know they are on Windows...?



  • @ndiwan said in Memory Leak in Qt 4.10.0:

    So How I can check memory leakage in Qt Creator running on Windows 10 ?

    I would imagine it would depend on what compiler you have chosen to use, which we don't know....


  • Lifetime Qt Champion

    @JonB According to Kits it's MinGW


  • Lifetime Qt Champion

    @JonB said in Memory Leak in Qt 4.10.0:

    why do Windows users think people ought know they are on Windows...?

    I don't know.
    And yes - my answer would also be - use valgrind or any other proper leak checker tool and how to you know that there is a memleak at all?



  • On Windows, it may be a good idea to use Visual Studio + Qt plugin. Visual Studio is a powerful tool and has memory check functions for C++ code.
    https://docs.microsoft.com/en-us/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2019



  • https://www.albertgao.xyz/2016/09/28/how-to-use-valgrind-on-windows/
    I came across this, but never tried it by myself. Strongly recommend to use VS.


  • Lifetime Qt Champion

    @JoeCFD said in Memory Leak in Qt 4.10.0:

    Visual Studio is a powerful tool

    powerful? Nice try...



  • Thanks , I will try VS.

    Thanks


Log in to reply