返回shared_ptr时的引用计数

时间:2010-10-11 09:53:38

标签: c++ smart-pointers

以下代码是否意味着当此函数返回时,此类中的请求对象仍保留对此对象的引用?

boost::shared_ptr<Request> RequestList::GetRequest()
{
    boost::mutex::scoped_lock(listmtx);
    request = boost::shared_ptr<Request>(new Request());
    return request;
}

使用:

request = requests->GetRequest();  //Ref count is two on request object when it returns??

即使在完成上述任务后,我们仍然在request ...

上有两个参考值

其中request只是一个RequestList指针(原始指针)......

3 个答案:

答案 0 :(得分:5)

  

request是一个私有类变量......

然后有两个shared_ptr对象带有new Request()的句柄:调用函数中的一个和私有类变量。两者都合法地破坏了引用计数。

除非存在私有类变量的原因,否则将其消除。至少,将其重命名为last_request,因为它就是它的真实含义。

(当然,当last_request被另一个GetRequest调用重新分配时,它对前一个请求的处理就会消失。)

答案 1 :(得分:2)

引用计数等于存在的共享指针数。在这种情况下,看起来,在创建共享指针之后,最终会得到两个副本(requestGetRequest()的分配,我猜这是RequestList的成员,以及request的结果GetRequest()的分配。

如果这两个都是共享指针,并且它们都没有引用相同的指针,那么最终会得到原始指针的两个副本,因此引用计数为2。

答案 2 :(得分:1)

返回时有两个,一个在声明的末尾。

request = boost::shared_ptr<Request>(new Request()); // ref count = 1
return request; // makes a copy of request. ref count = 2

所以当它返回时它是2,因为有一个临时的。

request = requests->GetRequest(); // it's two because there is still a temporary
// at the end of the statement all the temporaries are destroyed,
// ref count decremented to 1

当然,您可以使用request.use_count()来获取引用计数。