使用std :: unique_ptr时Qt Widget没有显示

时间:2015-09-28 03:50:34

标签: c++ qt c++11

我正在尝试动态地将新的QLabel插入到我的主窗口中。如果我不使用std :: unique_ptr,它可以正常工作,我可以看到QLabel被绘制在我的窗口。为什么我不能使用std :: unique_ptr或std :: shared_ptr?

MainWindow::MainWindow(QWidget *parent):QMainWindow(parent)
{

 setWindowFlags(Qt::FramelessWindowHint);
 ui.setupUi(this);

 std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();
 shrd_QLabel->setParent(this);
 shrd_QLabel->setText("test");
 shrd_QLabel->setGeometry(70, 70, 70, 70);
 shrd_QLabel->show();
 //The above doesnt work, however, below example works perfectly

 QLabel * lpQLabel = new QLabel();
 lpQLabel->setParent(this);
 lpQLabel->setText("TEST #2");
 lpQLabel->setGeometry(70, 170, 70, 70);
 lpQLabel->show();
}

2 个答案:

答案 0 :(得分:3)

您的代码有两个问题:

std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>();  // 1
shrd_QLabel->setParent(this);                                 // 2
  1. 您创建一个在范围结束时释放的智能指针(当MainWindow的构造函数返回时)
  2. 您将QLabel的{​​{3}}分配给MainWindow,因此QLabel现在有两个所有者 - 一个是unique_ptr,第二个是父{ {1}}。这是错误的,因为双方都认为他们是唯一所有者,因此您的MainWindow可能会被释放两次。
  3. 你的第二个例子是完全有效的。它有效,没有资源泄露 - 您的Qlabel将被其父QLabel解除分配。请注意,而不是:

    MainWindow
    你可以这样做:

    QLabel * lpQLabel = new QLabel();
    lpQLabel->setParent(this);
    

答案 1 :(得分:2)

当您使用std::unique_ptr时,会在范围的末尾删除该对象,因此您就像这样做了:

QLabel *shrd_QLabel = new QLabel;
shrd_QLabel->setParent(this);
shrd_QLabel->setText("test");
shrd_QLabel->setGeometry(70, 70, 70, 70);
shrd_QLabel->show();
delete shrd_QLabel;