如果可能的话使用boost :: scoped_ptr

时间:2013-03-05 13:37:32

标签: c++ boost

我在pagePtr.h中有这样的东西

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帮助我不要担心abt删除稍后创建的那些。如果是,我应该如何在这种情况下实施。 如果可以的话,还有哪些更好的选项可以删除那些创建的对象。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:3)

拥有一个动态分配对象并安全地将所有权返回给调用者的函数的习惯用法是返回std::unique_ptr

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

这会明确告诉调用者他们正在获取对象的所有权,并且当他们的std::unique_ptr被销毁时该对象将被销毁(除非所有权在其他地方进一步传递)。

应用于您的示例:

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可行,但没有多大意义 - 函数当然不会与调用者共享所有权,因为函数正在结束