gpt4 book ai didi

c++ - Qt & shared_pointer : execution error

转载 作者:太空宇宙 更新时间:2023-11-04 12:06:15 25 4
gpt4 key购买 nike

我正在尝试使用 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):

Starting /path/myproject-build-desktop-Qt_4_8_2_in_PATH_local_Release/myproject... The program has unexpectedly finished. /path/myproject-build-desktop-Qt_4_8_2_in_PATH_local_Release/myproject exited with code 0

当我注释标记的行时,程序运行但我有一个空窗口。

我有两个问题:

  1. 为什么这一行会出错?
  2. 在 Qt 中使用智能指针(实际上是为了构建健壮的 C++ 代码)是否正确?

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

最佳答案

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

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

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

关于c++ - Qt & shared_pointer : execution error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com