我有以下类调用一些 HTTP API 请求到服务器:
class NetworkRequest : public QObject {
public:
NetworkRequest(QNetworkAccessManager* netManager):
m_netManager(netManager){}
void send(QUrl const &url){
QNetworkRequest request(url);
auto reply = m_netManager->get(request);
connect(reply, &QNetworkReply::finished, [this, reply](){
// do some stuff with reply (like if url is redirected)
if(isRedirected(reply)){
// we have to delete the reply and send a new one
QUrl newUrl;
// somehow get the new url;
reply->deleteLater();
send(newUrl);
}
else{
reply->setParent(this); // so that it will be deleted when an instance of this class is deleted
emit completed(reply);
}
});
}
signals:
void completed(QNetworkReply* reply);
private:
QNetworkAccessManager* m_netManager;
bool isRedirected(QNetworkReply * reply){
bool yes = false;
/* process the process reply and determine yes is true or false
....
**/
return yes;
}
};
我以这种方式使用该类:
auto req = new NetworkRequest(nm);
req->send("http://someurl.com");
connect(req, &NetworkRequest::completed, randomClass, &RandomClass::slot);
// in RandomClass::slot I call NetworkRequest::deleteLater() when I finished with the network data
现在这显然涉及一些手动内存管理,我必须小心不要忘记删除原始指针。我想知道上面的代码是否可以使用QSharedPointer
(甚至std::shared_ptr
)编写并替换:
auto reply = m_netManager->get(request);
和:
auto smartReply = QSharedPointer<QNetworkReply>(m_netManager->get(request));
然后替换所有实例,reply
然后smartReply.get()
忘记手动删除回复对象。但是,我不清楚共享指针是否会自动删除对象,因为在我调用的时间范围send()
和信号之间QNetworkReply::finished
,智能指针会知道原始指针仍在使用中吗?另外,当我删除一个实例时NetworkRequest
,共享指针会自动删除QNetworkReply
它拥有的吗?