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

在boost.org网站上,我看到一个防止删除px.get()为shared_ptr(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上调用delete 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;
    }
};

除了删除器的类型是unique_ptr类型的一部分外,这个想法对于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();
}

VS2010没有实现无捕获的lambda到函数指针的隐式转换,所以第一个create_unique不能工作。


虽然调用delete px.get()是一件相当愚蠢的事情,但它通常不是你想要阻止的事情,因为它不是你偶然可以轻易做到的事情。 也就是说,以下是如何使用unique_ptr修复此问题的方法,但这很丑陋,因为删除器的类型泄漏到unique_ptr的类型中(为什么在查看unique_ptr与shared_ptr的实现细节时变得很明显),因此删除者必须是公开的,这意味着解决方案甚至不是防水的,因为任何人都可以使用删除者。 除非你让删除者的构造函数是私人的,并让X成为它的朋友,然而你也必须问自己的问题是为什么要麻烦? 有人必须通过编写delete px.get()来故意做错误的事情,以使其成为问题。

class X
{
private:
   ~X() {}

public:
    struct deleter
    {
        void operator()(X * p) { delete p; }
    };

    static std::unique_ptr<X, deleter> create()
    {
      std::unique_ptr<X, deleter> px(new X, deleter());
      return px;
    }
};
链接地址: http://www.djcxy.com/p/64231.html

上一篇: How to prevent delete px.get() for a unique

下一篇: Android canvas change some pixels color