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

Smart pointers as an alternative to QObject::deleteLater()

本文关键字:替代品 eleteLater QObject 智能 指针      更新时间:2023-10-16

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

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()来管理内存?

我认为在触发requestFinished之前,如果不将apiRequest对象存储在某个容器中,则无法使用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的可行性如何,但也许值得一试。