shared_ptr的一种特殊用法

2018-02-27 10:53:05来源:oschina作者:白加弱人点击

分享

众所周知,shared_ptr是常用的一种智能指针,通常的使用方法。


#include "stdafx.h"
#include
#include
#include
using namespace std;
class Person
{
};
int main()
{
std::shared_ptr p1(new Person(1));// Person(1)的引用计数为1
return 0;
}

如上当智能指针被析构,则真正的指针也会被析构。如果我们想要智能指针被析构,但是真正的指针不会析构该怎么实现呢?



class RemoveOnDelete {
OpTracker *tracker;
public:
RemoveOnDelete(OpTracker *tracker) : tracker(tracker) {}
void operator()(TrackedOp *op);
};
template
typename T::Ref create_request(U params)
{
typename T::Ref retval(new T(params, this),
RemoveOnDelete(this));
return retval;
}

之前ceph看到这段代码,一直觉得很奇怪。typename T::Ref是个智能指针,可是却带了2个参数。并且当智能指针引用减为0,并没有真正释放实际指针的内存。于是自己写了一个代码测试:


include
#include
#include
using namespace std;
class a;
typedef std::shared_ptr a_ptr;
class a {
};
class b {
public:
void operator()(a *)
{
cout<< "haha" << endl;
}
};
void test(a_ptr& c)
{
cout << "hello world" << endl;
}
int main()
{
a_ptr d(new a(), b());
test(d);
d.reset();
return 0;
}

其中class b必须要实现()运算符的重载,且要以指针a作为唯一参数,不然编译会报错。当执行d.reset()的时候会打印haha。可见当d被释放的时候执行了void operator()(a *)。


当我们不想真正释放某个分配内存,但是又要确保已经不会被使用,可以用上述方法

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台