1

我尝试使用tr1shared_ptrQt 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++ 代码)是正确的方法吗?

为了您的帮助,提前,谢谢。

4

2 回答 2

1

要回答您的第二个问题,不,您尝试将 shared_ptrs 与 Qt 一起使用的方式不起作用。

您的共享指针在函数末尾超出范围(这会破坏指向的对象,因为它们是管理对象生命周期的唯一且因此是最后一个 shared_ptr ),而 Qt 对象仍在抓住指向具有的对象的原始指针刚刚被删除。因此,仅出于这个原因,当 Qt 尝试使用无效对象时,您的代码将无法正常工作。那是未定义的行为。

此外,Qt 自己进行资源管理。您将指向子对象的原始指针传递给其父对象,当父对象超出范围时,父对象将负责删除子对象。所以此时,无论如何都会调用子对象的析构函数。

于 2012-08-14T20:23:57.747 回答
0

Qt 以自己的方式管理对象的生命周期。当你 make Achild of 时BAdelete'd 时B销毁。

所以,在这一行

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

你做mainLayout的孩子mainWidget

正如mainWidgetafter 声明的那样mainLayout,它将首先被删除。也mainLayout将被删除。但随后shared_ptr会尝试mainLayout再次删除。

Qt您使用智能指针时应该非常小心。Qt 内存管理通常获取对象的所有权(但并非总是如此)。此外,您可能更喜欢使用本机Qt智能指针

于 2012-08-14T20:33:57.297 回答