- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 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):
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
当我注释标记的行时,程序运行但我有一个空窗口。
我有两个问题:
为了您的帮助,提前,谢谢。
最佳答案
要回答您的第二个问题,不,您尝试将 shared_ptrs 与 Qt 一起使用的方式不起作用。
您的共享指针在函数结束时超出范围(这会破坏指向的对象,因为它们是唯一的,因此是最后一个管理对象生命周期的 shared_ptr),而 Qt 对象仍在抓取指向的原始指针刚刚删除的对象。因此,仅出于这个原因,您的代码将无法正常工作,因为 Qt 会尝试处理无效对象。这是未定义的行为。
另外,Qt 有自己的资源管理。您将指向子对象的原始指针传递给其父对象,当父对象超出范围时,父对象将负责删除子对象。所以此时,无论如何都会调用子对象的析构函数。
关于c++ - Qt & shared_pointer : execution error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960055/
因此,我正在尝试加深对 shared_ptr 的理解,如果多个共享 ptr 指向同一资源共享指针,则可以处理在销毁指向资源的最后一个指针之前不应调用 destrcutor 的情况。 这是我的示例代码:
有一段代码: A.cpp class MySomeClass: public SomeClass { public: void specificMethod(); } class A {
我有一个基本多态类(带有虚方法)和一个派生类。我正在尝试使用以下代码 boost::shared_ptr ptr( new derived_class() ); 但是编译器返回如下错误
我有一个派生自 std::enable_shared_from_this 的类。所有类对象都由共享指针管理,因此当没有更多共享指针指向它们时,它们会自动销毁。 我有一个类方法,它从程序的数据结构中删除
我有一个由 Node 和 Edge 类表示的有向图模型。每个 Node 对象都包含指向其所有传出和传入边的指针,每个 Edge 对象都包含指向其起点和终点(Node 对象)的指针。 class Mod
我正在尝试将派生类作为 std::shared_pointer 传递给一个函数,该函数的参数是具有模板的基类。 这是一个完整的例子: template class Base { public:
我使用 reset() 作为我的 shared_pointer 的默认值(相当于 NULL)。 但是如何检查 shared_pointer 是否为 NULL? 这会返回正确的值吗? boost::sh
我正在使用一个程序,其中我的代码调用第三方库,该库使用 boost 和 shared_pointers 来创建一个大而复杂的结构。这个结构是在我调用的方法中创建的,在方法结束时我知道程序已经完成。 对
我有一个函数返回类型为 const A 的共享指针。 std::shared_ptr getPointer() const; 我有一个函数需要 A 类型的 shared_ptr。 void foo(s
我正在尝试使用 tr1 的 shared_ptr 和 Qt 4.8.2 但我遇到了一些麻烦。这是我的代码: #include "mainwindow.h" #include "ui_mainwindo
我一直在尝试从 map 中填充 vector 。我知道如何以更传统的方式做到这一点,但我试图用 STL 算法(一个衬里)来实现它作为某种训练:)。 原始 map 类型是: std::map > 目标
我有以下问题,我想知道是否有更好的方法来解决它: class myObj { public: typedef std::shared_ptr handle; typedef std::
我基本上是这样设置的: class B { /* ... */}; class C1 : public B { /* ... */}; class C2 : public B { /* ... */}
我是一名优秀的程序员,十分优秀!