Qt& shared_pointer:执行错误

时间:2012-08-14 20:16:18

标签: c++ qt shared-ptr smart-pointers

我尝试使用 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

当我评论标记的行时,程序会运行,但我有一个空窗口。

我有两个问题:

  1. 为什么这行会出错?
  2. 使用Qt是否是使用智能指针(实际上是构建健壮的C ++代码)的正确方法?
  3. 为了你的帮助, 提前, 感谢。

2 个答案:

答案 0 :(得分:1)

要回答你的第二个问题,不,你试图在Qt中使用shared_ptrs的方式不起作用。

你的共享指针超出了函数末尾的范围(它会破坏指向对象,因为它们是唯一的,因此最后一个shared_ptr来管理对象的生命周期),而Qt对象仍然抓着原始指针刚刚删除的对象。所以仅仅因为这个原因,你的代码不会起作用,因为Qt试图使用无效对象。这是未定义的行为。

此外,Qt还有自己的资源管理。将原始指针传递给子对象到其父对象,父对象将在父对象超出范围时删除子对象。所以在这一点上,无论如何都要调用子对象的析构函数。

答案 1 :(得分:0)

Qt以自己的方式管理对象的生命周期。当您AB的孩子时,A将在delete被销毁时B

所以,在这一行

mainWidget->setLayout(mainLayout.get());

mainLayout的{​​{1}}孩子。

mainWidget之后声明的mainWidget,它将首先被删除。 mainLayout也将被移除。但是,mainLayout会尝试再次移除shared_ptr

mainLayout中,您应该非常小心地使用智能指针。 Qt memeory管理通常取得对象的所有权(但并非总是如此)。您也可以选择使用原生Qt智能指针