Solved 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
Usevalgrind
to detect memory leakages. -
@ndiwan there is no such thing as Qt 4.10.0
-
Thanks For Reply.
bolded textAttached 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
-
@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]
-
@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
-
@ndiwan Why do you actually add a rect each time paintEvent is called?
-
@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
-
@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 ?
Thanks
-
@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
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
-
@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
-
@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?
-
In the above screenshot Kit combo dropdown is disable. If I click manage , I can see this:
-
@ndiwan Do you have Valgrind? Check in Analyzer/Valgrind. You need to set the path to Valgrind executable.
-
@jsulm Since when does valgrind run on windows?