unique_ptr 并传递给连接

Posted

技术标签:

【中文标题】unique_ptr 并传递给连接【英文标题】:unique_ptr and passing to connect 【发布时间】:2015-10-23 02:10:09 【问题描述】:

在我的代码中

std::unique_ptr<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));

QObject::connect(myNetworkAccessManager.get(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));

有问题的代码:myNetworkAccessManager.get() in connect()

我的问题是最好的方法是什么?

我在这里阅读文章article 它在旧代码下的说明:

调用 get() 返回一个指向底层方法的指针。如果可以的话,你真的想避免调用它,因为一旦你将原始指针释放到野外,你就失去了通过切换到 unique_ptr 获得的大部分优势

更新

如果我将它改为使用如果我使用 QScopedPointer,我的代码如下:

QScopedPointer<QNetworkAccessManager> myNetworkAccessManager;
...
myNetworkAccessManager.reset(new QNetworkAccessManager(this));

QObject::connect(myNetworkAccessManager.data(), SIGNAL(finished(QNetworkReply *)), this, SLOT(OnNetworkFinished(QNetworkReply *)));

那么这是否是正确的解决方案:

connect(myNetworkAccessManager.data()

更新 2

阅读此链接***似乎使用 data() 是正确的解决方案。这意味着使用 stl 中的 get() 也是正确的。

【问题讨论】:

【参考方案1】:

Qt 有it's own memory management mechanism,因此将std::unique_ptr 用于使用该机制处理的对象是不正确的。我建议确保正确定义父子关系并让 Qt 为您处理。

【讨论】:

我更新了我的代码以使用 QScopedPointer 并想知道在 connect() 中使用 data() 是否正确 正如@Jefffrey 指出的那样,Qt 有自己的内存管理,但使用 get() 或 data() 获取指向对象的指针并没有错。由于对象必须是用于连接的 QObject,Qt 只是使用指针来监视对象的生命周期,它不会尝试获取所有权。在其他地方这绝对是不正确的,但对于信号和插槽,它在大多数情况下应该可以正常工作。熟悉std::enabled_shared_from_this,获取槽中的智能指针。 鉴于这一点多年来从未得到纠正,请记住并非所有 Qt 对象都由 Qt 的内存管理机制处理。奇怪的是,Qt's doc on Object Trees & Ownership 显示了没有父对象的示例,特别是在堆栈中声明它们的典型示例。鉴于堆栈的容量非常有限(默认情况下,在 Windows 上为 1MB,在 linux/macOS 上约为 8MB),因此习惯上在堆中声明根对象,其生命周期由std::unique_ptr 等智能指针管理。跨度>

以上是关于unique_ptr 并传递给连接的主要内容,如果未能解决你的问题,请参考以下文章

通过变量传递 unique_ptr [重复]

将 std::unique_ptr 传递给 CListBox::GetSelItems

使用已使用 new X() 创建的变量将 std::unique_ptr 传递给函数

从 unique_ptr 初始化 unique_ptr 常量引用

std::list< std::unique_ptr<T> >:传递它

通过rvalue传递不会破坏对象