在boost.org网站上,我看到了一个阻止对shared_ptr删除px.get()的示例(http://www.boost.org/doc/libs/1_51_0/libs/smart_ptr/sp_techniques.html#preventing_delete).
这是一个很好的技术,我想在C++ 11中使用std :: unique_ptr来应用它,并且经过一段时间的工具后,我无法让他们的示例使用std :: unique_ptr.
是否可以防止在std :: unique_ptr上调用删除px.get()?
以下是来自boost.org网站的代码,显示了如何防止删除px.get:
class X
{
private:
~X();
class deleter;
friend class deleter;
class deleter
{
public:
void operator()(X * p) { delete p; }
};
public:
static shared_ptr<X> create()
{
shared_ptr<X> px(new X, X::deleter());
return px;
}
};
Run Code Online (Sandbox Code Playgroud)
unique_ptr除了删除器的类型是 的类型的一部分这一事实之外,also 的想法保持不变unique_ptr。
#include <functional>
#include <memory>
#include <iostream>
using namespace std;
class X
{
private:
~X() {}
class deleter
{
public:
void operator()(X * p) { delete p; }
};
friend class deleter;
public:
static shared_ptr<X> create_shared()
{
shared_ptr<X> px(new X, X::deleter());
return px;
}
static unique_ptr<X, void(*)(X*)> create_unique()
{
return unique_ptr<X, void(*)(X*)>( new X, []( X *x ) {
X::deleter()( x );
} );
}
// If using VS2010
static unique_ptr<X, std::function<void(X*)>> create_unique()
{
return unique_ptr<X, std::function<void(X*)>>( new X, X::deleter() );
}
};
int main()
{
auto x = X::create_shared();
auto y = X::create_unique();
}
Run Code Online (Sandbox Code Playgroud)
VS2010 没有实现无捕获 lambda 到函数指针的隐式转换,因此第一个create_unique对其不起作用。
| 归档时间: |
|
| 查看次数: |
1256 次 |
| 最近记录: |