0

我在 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);
}

会 boost::scoped_ptr 帮助我不用担心稍后删除那些创建的对象。如果是的话,在这种情况下我应该如何实施。如果可以的话,还有什么其他可能的更好的选择来删除这些创建的对象。

4

2 回答 2

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. 不利的一面是 usingshared_ptr并不表示唯一的所有权并为不需要的引用计数付出代价(有关可用智能指针的更多信息和描述,请参阅有哪些 C++ 智能指针实现可用?)。

从发布的代码中,pagePtr似乎是函数指针的包装器,因此请考虑使用boost::function它,它是可复制的,并完全删除pagePtr

typedef boost::function<int(char* sz,
                            unsigned int max_bytes,
                            char* arg1,
                            char* arg2,
                            char* arg3,
                            char* arg4)> FunPtrType;
于 2013-03-05T13:47:55.920 回答
3

拥有一个动态分配对象并安全地将所有权返回给调用者的函数的习惯用法是返回 a 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根本无法传递所有权 - 它是最严格的智能指针(几乎等同于 a const std::unique_ptr
  • std::auto_ptr已弃用,因为它通过复制提供移动语义
  • std::shared_ptr会起作用,但没有多大意义——该函数肯定不会与调用者共享所有权,因为该函数正在结束
于 2013-03-05T13:47:51.843 回答