QWidget初始化函数调用中的不同行为

Posted

技术标签:

【中文标题】QWidget初始化函数调用中的不同行为【英文标题】:QWidget Initialization different behavior in function calls 【发布时间】:2018-06-15 07:58:32 【问题描述】:

我定义了一个QWidget 并将其初始化为NULL:

QWidget* widget;
widget = NULL;

稍后单击按钮时,我会初始化此小部件并调用 show 函数。在随后的运行中,如果它已经初始化,我只需调用 show 函数:

if(widget == NULL)
   widget = new QWidget();
   widget->show();
 else 
   widget->show();

它工作正常,如果小部件已经初始化,我看到它不会再次初始化。但是现在考虑这种情况,我将小部件传递给一个函数来做同样的事情:

void showGUI(QWidget* w)
     if(w == NULL)
          w = new QWidget();
          w->show();
      else 
          w->show();
     

每当按钮被调用时:

showGUI(widget);

但这一次,它总是评估指向 NULL 的指针并总是初始化一个新的小部件。 我不明白在这种情况下真正发生了什么变化?

【问题讨论】:

这是内存泄漏。将小部件传递给 showGUI 时,指针的值不会保存在小部件中。此外,您应该考虑使用 nullptr 而不是 NULL。 @Pimich 这仅对小部件指针有效吗? 任何指针都会发生这种情况。基本上,当使用具有指针作为参数的函数时,将在函数内部使用临时指针。因此,如果临时指针的值发生变化,它不会影响函数外的指针。 【参考方案1】:

参数w是一个指针,但它本身是按值传递的。函数内部的w 是从参数中复制而来的,对它的任何修改都与原始参数无关。

您可以将其更改为传递引用,例如

void showGUI(QWidget*& w)
     if(w == NULL)
          w = new QWidget();
          w->show();
      else 
          w->show();
     

【讨论】:

以上是关于QWidget初始化函数调用中的不同行为的主要内容,如果未能解决你的问题,请参考以下文章

闭包中的Swift可变结构和结构的行为不同

扩展 QWidget 上的 Qt/C++ 调用函数

为啥从独立函数生成的 pyplot 窗口与从事件处理程序调用的函数生成时的行为不同?

调用 setVisible(false) 在 QWidget 的构造函数中不起作用

从 Objective C++ 调用 OpenCv inRange 函数时的行为不同

SELECT 和 FUNCTION 调用之间的查询行为不同