如何防止删除unique_ptr的px.get()

Ahi*_*iya 7 c++ c++11

在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)

Pra*_*ian 2

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对其不起作用。