将 Qt 对象与 std::shared_ptr 一起使用
using Qt objects with std::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
}
编译错误为:
错误我1 错误 C2664:"QVBox布局::QVBox布局(QWidget *)":无法 将参数 1 从 'QVBoxLayout *' 转换为 '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被销毁时,对象将再次被删除。这里的情况并非如此,但要小心:)
std::make_shared
的参数将传递给您正在实例化的类的构造函数。所以基本上你正在做的相当于:
new QVBoxLayout(new QVBoxLayout(centralwidget.get()))
我认为您要做的是:
centralwidget = std::make_shared<QWidget>(MainWindow);
verticalLayout = std::make_shared<QVBoxLayout>(centralwidget.get());
查看std::make_shared
的文档(例如此处)。此函数的重点是在内存中的对象实例附近分配引用计数,因此您必须让它为您分配。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- CLANG 编译器 说:变量"PTR"可能未初始化
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 将 std::allocate_shared 与多态资源分配器一起使用
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 将 exprtk 与自定义类的对象一起使用
- 将 std::set 与基于键的比较器一起使用
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?