QToolBar儿童名单一直在增长.Qt 内存泄漏
QToolBar children list always growing. Qt memory leak?
我只想有一个 QToolBar 实例,并在应用程序执行期间多次修改它。但是,我担心Qt完成的内存管理。
请考虑以下事项:
QToolBar toolBar;
std::cout << toolBar.actions().size() << std::endl; // Prints 0
toolBar.addSeparator(); // will add an action
std::cout << toolBar.actions().size() << std::endl; // Prints 1
toolBar.clear();
std::cout << toolBar.actions().size() << std::endl; // Prints 0 again. Good!
最初,QToolBar 中的操作列表为空。因此,第一个 cout 打印"0"。内部操作通过"addSeparator"添加到该列表中。所以第二个 cout 打印"1"。最后,"清除",正如预期的那样,删除所有操作,最后一个 cout 再次打印"0"。
现在,考虑一下"儿童列表"会发生什么:
QToolBar toolBar;
std::cout << toolBar.children().size() << std::endl; // Prints 3. Why?
toolBar.addSeparator(); // will add an action
std::cout << toolBar.children().size() << std::endl; // Prints 5. "addSeparator" has added two children.
toolBar.clear();
std::cout << toolBar.children().size() << std::endl; // Still prints 5. "Clear" did not remove any children!
最初,子列表的大小为 3。然后我调用"addSeparator",两个人被添加到该列表中。好吧,我可以忍受。但是,在呼吁"清除"这些家伙之后,这些家伙并没有被删除。对于每个"addSeparator"或"addWidget"调用,将添加两个子项,并且永远不会删除它们。
我正在使用Qt 5.4.1 for MSVC 2013,Windows。
编辑:添加 peppe 建议的代码。请阅读行注释。
QToolBar toolBar;
std::cout << toolBar.children().size() << std::endl; // Prints 3.
toolBar.addSeparator();
std::cout << toolBar.children().size() << std::endl; // Prints 5. "addSeparator" has added two children.
auto actions = toolBar.actions();
for (auto& a : actions) {
delete a;
}
std::cout << toolBar.children().size() << std::endl; // Now this prints 4. Shouldn't be 3?
看看addSeparator
的实现:
QAction *QToolBar::addSeparator()
{
QAction *action = new QAction(this);
action->setSeparator(true);
addAction(action);
return action;
}
这将创建一个新的子QAction
并将其添加到小组件的操作列表中。 clear
清除操作列表,但不会销毁操作!因此,它们仍将作为工具栏的子项存在。
Qt不知道你没有在其他地方使用这些操作 - 它们应该在多个小部件中使用。如果要回收该内存,请删除 addSeparator
返回的操作。
相关文章:
- Qt对象所有权内存泄漏
- Qt 4.8.7 内存伪影
- Qt QProcess 获取内存信息
- QT-如何处理对话框的内存管理
- 如何在Qt中处理子类中的动态内存分配
- 如何使用Qt的原生OpenGL获得总GPU内存?
- 从 Qt 类派生的用户定义类中的内存所有权
- QT图像查看器示例,可能存在内存泄漏
- 如何在C 中制作QT GUI应用,而不会内存泄漏
- Qt内存管理
- VC++和Qt应用程序之间使用共享内存进行通信
- QToolBar儿童名单一直在增长.Qt 内存泄漏
- 使用QPixmap的Qt内存泄漏
- 添加空间隔小部件导致Qt内存泄漏
- Valgrind的Qt内存泄漏抑制文件
- 容器的Qt内存管理
- Delphi到Qt/C++:t内存流
- Qt/ c++内存泄漏与QThread和QPainter::drawText()
- c++ Qt内存分配异常QList
- qt内存问题与camerainfo和combobox.currentText()