以下代码是否意味着当此函数返回时,此类中的请求对象仍保留对此对象的引用?
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指针(原始指针)......
答案 0 :(得分:5)
request是一个私有类变量......
然后有两个shared_ptr
对象带有new Request()
的句柄:调用函数中的一个和私有类变量。两者都合法地破坏了引用计数。
除非存在私有类变量的原因,否则将其消除。至少,将其重命名为last_request
,因为它就是它的真实含义。
(当然,当last_request
被另一个GetRequest
调用重新分配时,它对前一个请求的处理就会消失。)
答案 1 :(得分:2)
引用计数等于存在的共享指针数。在这种情况下,看起来,在创建共享指针之后,最终会得到两个副本(request
内GetRequest()
的分配,我猜这是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()
来获取引用计数。