c++ - 使用带有 std::shared_ptr 的 Qt 对象

标签 c++ qt shared-ptr

我正在尝试将一个小型实用程序应用程序更新为更现代的 C++ 风格,但我在使用带有 std::shared_ptr 的一些 Qt 对象时遇到了问题,尤其是那些接收其他 QWidget 作为构造函数参数的对象。

例如:

private:
    std::shared_ptr<QWidget> centralwidget;
    std::shared_ptr<QVBoxLayout> verticalLayout;

public:
    void setupUi(QMainWindow *MainWindow) // this pointer is a .get() from a shared_ptr
    {
        centralwidget = std::make_shared<QWidget>(new QWidget(MainWindow)); // compiles fine
        verticalLayout = std::make_shared<QVBoxLayout>(new QVBoxLayout(centralwidget.get())); // does not compile
    }

编译错误为:

Error 1 error C2664: 'QVBoxLayout::QVBoxLayout(QWidget *)' : cannot convert parameter 1 from 'QVBoxLayout *' to 'QWidget *' e:\microsoft visual studio 11.0\vc\include\memory 855

我似乎无法理解这个错误,我没有转换任何东西,我只是想创建一个 QVBoxLayout 对象并将 QWidget 作为其父对象传递(就像我对原始指针所做的那样)。

最佳答案

一般来说,我尽量避免对 Qt GUI 对象使用 shared_ptr,因为 Qt 已经提供了自己的内存管理机制。每个 QObject 都可能有一个父对象,当这个父对象死亡时,他会删除它的所有子对象。这里不需要 shared_pointer 并且不会给您任何附加值:您可以完美地使用原始指针而不会造成内存泄漏。

一般来说,如果 QObject 的父对象在最后一个 shared_ptr 实例被删除之前死亡,您很快就会遇到麻烦,因为当最后一个 shared_ptr 被销毁时,对象将被第二次删除。这里不是这种情况,但要小心 :)

关于c++ - 使用带有 std::shared_ptr 的 Qt 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963246/

相关文章:

c++ - 如何简单地调整指针的集合或映射排序谓词

c++ - 将 shared_ptr 与对象数组一起使用

c++ - 匿名结构中声明的函数的名称解析

qt - 如何忽略 qml WebEngineView 上的证书错误

javascript - QGraphicsWebView : create a text file using Javascript

qt - QProcess 以来自 stdin 和 stdout 的文件开始

c++ - 如何在 C++ 中创建包含在共享指针中的对象的重复实例?

c++ - RSA_private_decrypt错误

c++ - 模板参数推导/替换失败 - std::find()

c++ - 两次 GCC 编译相同的输入,生成两个不同的代码(第二个错误)