众所周知,shared_ptr是常用的一种智能指针,通常的使用方法。
#include "stdafx.h"
#include <iostream>
#include <future>
#include <thread>
using namespace std;
class Person
{
};
int main()
{
std::shared_ptr<Person> 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, typename U>
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 <iostream>
#include <set>
#include <boost/shared_ptr.hpp>
using namespace std;
class a;
typedef std::shared_ptr<a> 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 *)。
当我们不想真正释放某个分配内存,但是又要确保已经不会被使用,可以用上述方法