Qt&shared_pointer:执行错误
Qt & shared_pointer : execution error
我尝试使用 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):
Start/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
当我注释标记的行时,程序运行,但我有一个空窗口。
我有两个问题:
- 为什么这条线会出错?
- 这是使用Qt使用智能指针(实际上是构建健壮C++代码)的正确方法吗?
为了您的帮助,提前谢谢。
回答你的第二个问题,不,你试图将shared_ptrs与Qt一起使用的方式不起作用。
您的共享指针在函数结束时超出了范围(这会破坏指向的对象,因为它们是管理对象生命周期的唯一也是最后一个shared_ptr),而 Qt 对象仍然抓住指向刚刚删除的对象的原始指针。因此,仅出于这个原因,您的代码将无法工作,因为Qt尝试使用无效对象。这是不确定的行为。
此外,Qt进行自己的资源管理。将指向子对象的原始指针传递给其父对象,当父对象超出范围时,父对象将负责删除子对象。因此,此时,无论如何都会调用子对象的析构函数。
Qt以自己的方式管理对象的生命周期。当你A
B
的孩子时,A
就会被delete
B
毁灭。
所以,在这一行
mainWidget->setLayout(mainLayout.get());
你使mainLayout
mainWidget
的孩子.
正如mainWidget
mainLayout
后声明的那样,它将首先被删除。mainLayout
也将被删除。但是shared_ptr
会再次尝试删除mainLayout
。
在Qt
你应该非常小心地使用智能指针。Qt模因管理通常拥有对象的所有权(但并非总是如此)。此外,您可能更喜欢使用本机Qt
智能指针
-
QPointer
作为指向QObject
的周指针 -
QScopedPointer
作为std::unique_ptr
等的替代品。 -
QSharedPointer
/QExplicitlySharedPointer
用于碎指针。
- 为什么g++在未执行的代码处标记强制转换错误
- 执行错误访问 遍历向量
- 解决方案在第 25 行执行错误'out of bounds'
- dll 生成成功,但在加载 dll 时执行错误
- Luci 无法启动请求的 CGI 程序:/www/cgi-bin/sample.cgi:执行错误
- 当函数在 GCC 中没有任何返回时,如何强制执行错误?
- winapi函数loadLibrary()导致函数在执行错误期间失败
- libcurl、OSX、curl_multi_执行错误访问
- 使用InstallShield(windows)部署的C++应用程序执行错误
- Qt&shared_pointer:执行错误
- 如何修复此执行错误
- 可执行错误:无法启动程序
- 贪婪送礼者USACO培训计划中的执行错误
- C++程序上的执行错误:静态可执行文件调用 DLL 库
- 从 dll 生成库 -执行>错误
- Qt可执行错误:0xc0000139试图在Qt应用程序中合并c++
- 指针矩阵执行错误
- DirectX12 commandList执行错误
- c++凯撒密码程序执行错误字符
- Qt 可执行错误 - dll 库