我们在具有许多 qgraphicsitem 后代的嵌入式 arm linux 平台上有一个多线程 c++ qt (4.8.1) 应用程序。当调用他们的 update() 方法时,mtrace 会显示增量内存使用情况,每次更新大约 16-18 个字节。观察应用程序 VSZ(使用 ps 或 top 命令),它也在不断增加。如果我们在 valgrind --tool=memcheck 中启动应用程序,并且应用程序正常终止,我们不会看到“肯定丢失”的块。
如果我们注释掉 update() 调用,mtrace 不会再显示任何未释放的区域。
Qt 中是否有可能存在“仍然可达”且不断增长的内存块、重新分配的区域、STL 向量等?如果是,我们如何定期清除它们?
程序结构如下:
int main( int argc, char* argv[] ) {
// new thread creations, initializations, qt object creations
...
mtrace();
while ( runEnabled ) {
// this is where new events arrive, and the graphics is updated
...
}
muntrace();
// cleanups, desctructions
...
}
所以 mtrace 只监控活动部分,它应该在我们的嵌入式环境中运行几个月。
谢谢,丹尼尔