我尝试使用 tr1 的 shared_ptr 和 Qt 4.8.2 ,但我遇到了一些麻烦。 这是我的代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <string>
#include <tr1/memory>
using namespace std::tr1;
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QTreeView>
#include <QListView>
#include <QWidget>
#include <iostream>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
shared_ptr<QHBoxLayout> mainLayout(new QHBoxLayout);
shared_ptr<QTreeView> mainFeeds(new QTreeView);
mainLayout->addWidget(mainFeeds.get());
shared_ptr<QWidget> mainWidget (new QWidget);
mainWidget->setLayout(mainLayout.get()); // <--- this line
shared_ptr<QWidget> rightWidget(new QWidget);
shared_ptr<QVBoxLayout> rightLayout(new QVBoxLayout);
shared_ptr<QListView> rightItems(new QListView);
rightLayout->addWidget(rightItems.get());
shared_ptr<QListView> rightPreview(new QListView);
rightLayout->addWidget(rightPreview.get());
rightWidget->setLayout(rightLayout.get());
mainLayout->addWidget(rightWidget.get());
this->setCentralWidget(mainWidget.get());
}
MainWindow::~MainWindow()
{
delete ui;
}
输出(我使用Qt Creator):
启动/ path / myproject-build-desktop-Qt_4_8_2_in_PATH_ local _Release / myproject ... 该计划意外完成。 / path / myproject-build-desktop-Qt_4_8_2_in_PATH_ local _Release / myproject退出,代码为0
当我评论标记的行时,程序会运行,但我有一个空窗口。
我有两个问题:
为了你的帮助, 提前, 感谢。
答案 0 :(得分:1)
要回答你的第二个问题,不,你试图在Qt中使用shared_ptrs的方式不起作用。
你的共享指针超出了函数末尾的范围(它会破坏指向对象,因为它们是唯一的,因此最后一个shared_ptr来管理对象的生命周期),而Qt对象仍然抓着原始指针刚刚删除的对象。所以仅仅因为这个原因,你的代码不会起作用,因为Qt试图使用无效对象。这是未定义的行为。
此外,Qt还有自己的资源管理。将原始指针传递给子对象到其父对象,父对象将在父对象超出范围时删除子对象。所以在这一点上,无论如何都要调用子对象的析构函数。
答案 1 :(得分:0)
Qt以自己的方式管理对象的生命周期。当您A
为B
的孩子时,A
将在delete
被销毁时B
。
所以,在这一行
mainWidget->setLayout(mainLayout.get());
您mainLayout
的{{1}}孩子。
在mainWidget
之后声明的mainWidget
,它将首先被删除。 mainLayout
也将被移除。但是,mainLayout
会尝试再次移除shared_ptr
。
在mainLayout
中,您应该非常小心地使用智能指针。 Qt memeory管理通常取得对象的所有权(但并非总是如此)。您也可以选择使用原生Qt
智能指针
QPointer
作为指向Qt
QScopedPointer
替代QObject
等。QSharedPointer
/ QExplicitlySharedPointer
表示碎片指针。