智能指针作为 QObject::deleteLater() 的替代品

     2023-03-25     286

关键词:

【中文标题】智能指针作为 QObject::deleteLater() 的替代品【英文标题】:Smart pointers as an alternative to QObject::deleteLater() 【发布时间】:2019-01-20 19:13:42 【问题描述】:

所以我有一个发出网络请求的函数:

void MyClass::makeRequest()

    ApiRequest* apiRequest = new ApiRequest();

    apiRequest->makeRequest();
    connect(apiRequest, &ApiRequest::requestFinished, this, &MyClass:onApiRequestFinished);

由于我需要对象 apiRequest 生存直到我的请求完成,所以我调用:

void MyClass:onApiRequestFinished()

    // do my stuff
    // now I can delete my request object ((retrieved using sender()) using deleteLater()

既然在这种情况下我没有使用 Qt 父子系统,我该如何使用 C++11 智能指针而不是调用 deleteLater() 来管理内存?

【问题讨论】:

根据我的经验,最好不要尝试将 Qt 的父子系统与智能指针混合;也就是说,如果您使用 Qt 的系统来处理 QObject 派生的对象和仅用于非 QObject 派生的对象的智能指针,那么您的生活将不会那么痛苦。 除了 Jeremy:如果智能指针指向它,您不应该明确删除(通过delete 或类似的东西)。通常,智能指针明确致力于管理其指针的生命周期。 (不包括不应该单独使用的弱指针)。 对我来说,父子系统deleteLater无关,因为系统是直接清理子系统。 deleteLater的使用与信号槽系统有关。因此,在我看来,您不使用 父子系统 与使用或不使用deleteLater 的选择无关。而你确实使用 信号槽系统 是的,我明白了。我问的唯一原因是知道如何使用智能指针处理这种情况。如何让对象在插槽被触发之前存活。 更具体地说,我想知道 unique_ptrshared_ptr 是否有办法生存,直到信号被触发然后被删除。 【参考方案1】:

如果不将apiRequest 对象存储在某个容器中,直到触发requestFinished,我认为您无法使用C++ 智能指针解决此问题。

也许另一种方法是创建一个ApiRequest::finished() 方法用作信号的receiver,然后将this 传递给ApiRequest 的构造函数,以便finished() 可以调用MyClass::onApiRequestFinished(),然后在onApiRequestFinished() 退出后让finished() 调用delete this,例如:

void MyClass::makeRequest()

    ApiRequest* apiRequest = new ApiRequest(this);
    apiRequest->makeRequest();


void MyClass::onApiRequestFinished()

    // do my stuff


...

ApiRequest::ApiRequest(MyClass *cls)
    : m_cls(cls)

    connect(this, &ApiRequest::requestFinished, this, &ApiRequest::finished);


void ApiRequest::finished()

    m_cls->onApiRequestFinished();
    delete this;

不确定这在 Qt 中是否可行,但也许值得一试。

【讨论】:

但这并没有提供比我当前更好的解决方案,并且仅将ApiRequestMyClass 联系起来。在我的最后一个插槽中,我可以通过 auto apiRequest = qobject_cast<ApiRequest*>(sender()); 获取 ApiRequest 对象,然后在其上调用 deleteLater()

strblob类——智能指针作为成员

/* 管理string的类 使用vector来管理元素 由于类对象被销毁时相应的元素成员也将销毁 所以需要将vector保存在动态内存中*///该程序鲁棒性不强,没有考虑到vector为空的情况#include<iostream>#include<memory>#include<vector>#include... 查看详情

智能指针作为条件:if (p) 和 if (i.get()) 是不是等效?

】智能指针作为条件:if(p)和if(i.get())是不是等效?【英文标题】:Smartpointerascondition:areif(p)andif(p.get())equilavent?智能指针作为条件:if(p)和if(i.get())是否等效?【发布时间】:2016-10-1713:41:50【问题描述】:让p成为共享/唯一指针。if... 查看详情

C++ 对象池,将项目作为智能指针提供,在删除时返回池

】C++对象池,将项目作为智能指针提供,在删除时返回池【英文标题】:C++object-poolthatprovidesitemsassmart-pointersthatarereturnedtopoolupondeletion【发布时间】:2015-03-0520:20:15【问题描述】:我对c++-ideas很感兴趣,但遇到了这个问题。我想... 查看详情

工程实践:到底要不要使用智能指针(代码片段)

工程实践:到底要不要使用智能指针前言从需求开始探讨问题智能指针现状unique_ptr示例shard_ptr接口该不该使用智能指针智能指针作为函数参数智能指针作为函数返回值如何选择智能指针注意不要踩的“坑”总结参考资料前言... 查看详情

指针能作为引用参数吗?

参考技术A智能指针当然可以做为参数传递,但是在使用auto_ptr创建一个智能指针临时对象作为函数参数是一个很危险的事,要注意! 参考技术B任何变量类型都可以作为引用指针也不例外。比如voidfunc(char*&p)p=newchar[100];这里对p的... 查看详情

智能指针注意事项

...循环引用3:当需要在类得内部接口中,需要将this作为智能指针使用,需要用该类派生自enable_shared_from_this4:使用share_ptr作为函数接口时候,最好用constshare_ptr&5:share_ptrweak_ptr和裸指针 查看详情

我可以在 C++ Actor Framework 中使用 C++11 智能指针作为消息返回类型吗?

】我可以在C++ActorFramework中使用C++11智能指针作为消息返回类型吗?【英文标题】:CanIuseC++11smartpointersasamessagereturntypeintheC++ActorFramework?【发布时间】:2015-11-1021:44:21【问题描述】:当我使用unique_ptr作为返回类型时,我收到编译... 查看详情

“智能指针”的成长

  智能指针是什么,他的真面目就是一个类生成的对象,这个类中包含了基本的重载->、*等一些指针形态的用法,最主要的是这个类里面有一个指针参数:所有智能指针类中都有一个explicit构造函数,以指针作为参数。比如a... 查看详情

使用智能指针释放内存

】使用智能指针释放内存【英文标题】:Memorydeallocationwithsmartpointer【发布时间】:2012-07-1807:10:40【问题描述】:在C++中,假设Helper类中有一个方法,它返回一个指向另一个对象的指针。除了方法签名和返回对象的类型外,我没... 查看详情

将智能指针传递给函数

】将智能指针传递给函数【英文标题】:Passingsmartpointerstoafunction【发布时间】:2015-10-3016:42:16【问题描述】:我有一个二维智能指针数组。我可以给它赋值并显示它,但是我无法将它传递给一个以double**作为输入的函数。一个简... 查看详情

智能指针的迭代和容器

】智能指针的迭代和容器【英文标题】:Iterating&containersofsmartpointers【发布时间】:2010-02-1223:45:16【问题描述】:我有一个指向可变对象的智能指针容器。我必须编写两个for_each循环,一个用于将对象作为只读数据访问,另一... 查看详情

具有在参数中返回指针的函数的智能指针

】具有在参数中返回指针的函数的智能指针【英文标题】:Smartpointerswithfunctionsreturningapointerinanargument【发布时间】:2021-10-1308:50:13【问题描述】:这个问题被讨论过几次,但所有这些讨论都已经有近十年的历史了,而且没有好... 查看详情

工程实践:到底要不要使用智能指针(代码片段)

工程实践:到底要不要使用智能指针前言从需求开始探讨问题智能指针现状unique_ptr示例shard_ptr接口该不该使用智能指针智能指针作为函数参数智能指针作为函数返回值如何选择智能指针注意不要踩的“坑”总结参考资料前言... 查看详情

使用tr1的智能指针(代码片段)

作为C++程序员,在没有智能指针,手动管理内存的蛮荒岁月里,可以说是暗无天日,痛苦异常。直到上帝说,还是要有光,于是智能指针进了标准。C++码农的日子总算好起来了。虽然一直鄙视着没有显式指针的语言,但是对其自... 查看详情

有没有办法编写模板函数来处理智能指针和常规指针?

】有没有办法编写模板函数来处理智能指针和常规指针?【英文标题】:isthereawaytowriteatemplatefunctionfordealingwithsmartpointerandregularpointer?【发布时间】:2021-08-2416:09:14【问题描述】:请我尝试编写一个接受智能指针或常规指针向量... 查看详情

智能指针剖析

auto_ptr已经废弃。原因是它行为上是"排它性"指针,但又允许编译器实现拷贝操作,拷贝后的右值会被赋空。即将“传递”语义掩盖在“拷贝”动作之下。即a=b时,作为右值的b的物理指针会是NULL。会造成使用它的容器混乱。这是... 查看详情

在条件或循环中分配智能指针

】在条件或循环中分配智能指针【英文标题】:Assignsmartpointerinconditionorloop【发布时间】:2017-10-1822:32:20【问题描述】:我正在更新一些c++11之前的代码以使用c++11unique_ptrs。我不确定如何处理的一件事是旧代码何时使用指针赋值... 查看详情

如果我指向/引用/制作别名,我应该使用原始指针(而不是智能指针)吗?

...果我指向/引用/制作别名,我应该使用原始指针(而不是智能指针)吗?【英文标题】:C++ShouldIrawpointer(insteadofsmart)ifIampointing/referencing/makinganalias?【发布时间】:2015-11-2615:39:07【问题描述】:我正在创建一个字符串解析器类,并... 查看详情