2013-03-05 41 views
0

我在pagePtr.h使用boost :: scoped_ptr的如果可能的话

typedef int (*FunPtrType)(char* sz, unsigned int max_bytes, char* arg1, 
char* arg2, char* arg3, char* arg4); 

并创建一个对象

static pagePtr* CreatePage(FunPtrType Ptr2Fun) 
{ 
    return new pagePtr(ptr2Fun); 
} 

将提振::静态函数是这样的scoped_ptr的帮助我不用担心删除那些稍后创建的。如果是的话,我应该如何执行这种情况。 还有什么可能的更好的选择,如果可用,删除这些创建的对象。

+3

你需要'的std :: unique_ptr'。 'boost :: scoped_ptr'不能传递。 – 2013-03-05 13:38:53

+0

你可以使用std :: unique_ptr或std :: shared_ptr:std :: unique_ptr CreatePage(...)... – AnatolyS 2013-03-05 13:42:07

+0

你能帮助我看看在我的情况下使用std :: unique_ptr的实现方式吗? – cybercop 2013-03-05 13:47:02

回答

3

对于具有动态分配一个对象,并安全地返回所有权给调用者是返回一个函数的成语一个std::unique_ptr

std::unique_ptr<foo> create_foo() 
{ 
    return std::unique_ptr<foo>(new foo()); 
} 

这告诉来电者明确表示,他们所得到的对象和所有权物品在销毁时会被销毁(除非所有权在别处进一步传递)。

适用于你的例子:

static std::unique_ptr<pagePtr> CreatePage(FunPtrType ptr2Fun) 
{ 
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun)); 
} 

至于为什么其他指针不适用:

  • boost::scoped_ptr无法通过所有权的全部 - 这是最严格的智能指针(几乎相当于const std::unique_ptr
  • std::auto_ptr已弃用,因为它通过复制提供移动语义
  • std::shared_ptr会工作,但并没有太大的意义 - 当然,该功能不会与呼叫者共享所有权,因为函数结束
5

boost:scoped_ptr是不可拷贝所以不能从CreatePage()返回。如果C++ 11可std::unique_ptr可用于:

static std::unique_ptr<pagePtr> CreatePage(FunPtrType Ptr2Fun) 
{ 
    return std::unique_ptr<pagePtr>(new pagePtr(ptr2Fun)); 
} 

是否有一个原因是pagePtr不可拷贝?如果不是,并且复制便宜,然后按值返回。

如果pagePtr是不可复制和std::unique_ptr不可用,那么你可以使用boost::shared_ptr从主叫取出责任心的破坏返回pagePtr。缺点是使用shared_ptr并不表示只有所有权,并为不需要的引用计数支付价格(有关可用智能指针的更多信息和说明,请参阅What C++ Smart Pointer Implementations are available?)。

从发布代码,pagePtr似乎周围的函数指针的包装所以请考虑使用替代boost::function,这是可复制,并彻底清除pagePtr

typedef boost::function<int(char* sz, 
          unsigned int max_bytes, 
          char* arg1, 
          char* arg2, 
          char* arg3, 
          char* arg4)> FunPtrType; 
+0

实际上,'std :: unique_ptr'没有拷贝构造函数;这是所谓的移动构造函数。 – refi64 2014-05-15 01:23:51

相关问题