我正在尝试动态地将新的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();
}
答案 0 :(得分:3)
您的代码有两个问题:
std::unique_ptr<QLabel> shrd_QLabel = make_unique<QLabel>(); // 1
shrd_QLabel->setParent(this); // 2
MainWindow
的构造函数返回时)QLabel
的{{3}}分配给MainWindow
,因此QLabel
现在有两个所有者 - 一个是unique_ptr
,第二个是父{ {1}}。这是错误的,因为双方都认为他们是唯一所有者,因此您的MainWindow
可能会被释放两次。你的第二个例子是完全有效的。它有效,没有资源泄露 - 您的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;