QToolBar儿童名单总是在增长。 Qt内存泄漏?

时间:2016-02-04 14:17:47

标签: c++ qt memory-leaks qt5 qtoolbar

我想只有一个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打印&#34; 0&#34;。通过&#34; addSeparator&#34;将内部操作添加到该列表中。所以第二个cout打印&#34; 1&#34;。最后,&#34;清除&#34;,如预期的那样,删除所有操作和最后的cout打印&#34; 0&#34;试。

现在,考虑一下&#34;子列表&#34;:

会发生什么
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.然后我打电话给#34; addSeparator&#34;两个人被添加到该列表中。好的,我可以忍受。然而,在打电话给&#34;清除&#34;这些家伙没有被删除。对于每个&#34; addSeparator&#34;或&#34; addWidget&#34;电话,两个孩子被添加,他们永远不会被删除。

我使用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?

1 个答案:

答案 0 :(得分:2)

请看一下addSeparator的实现:

QAction *QToolBar::addSeparator()
{
    QAction *action = new QAction(this);
    action->setSeparator(true);
    addAction(action);
    return action;
}

这将创建一个新的子QAction并将其添加到窗口小部件的操作列表中。 clear清除操作列表,但不会破坏操作!因此他们仍然会像工具栏的孩子一样。

Qt并不知道您没有在其他地方使用这些操作 - 它们应该用于多个小部件。如果要回收该内存,请删除addSeparator返回的操作。