我在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删除稍后创建的那些。如果是,我应该如何在这种情况下实施。 如果可以的话,还有哪些更好的选项可以删除那些创建的对象。
答案 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
可行,但没有多大意义 - 函数当然不会与调用者共享所有权,因为函数正在结束