scoped_ptr用于具有替换自由方法的结构

时间:2010-07-16 10:22:12

标签: c++ boost stl scoped-ptr

我有一个结构

typedef struct myStruct_st
{
  int a;
}myStruct;

可以使用

创建
myStruct * myStruct_new()
{
  printf("Allocate\n");
  return new myStruct;
}

并使用

删除
static void myStruct_free(myStruct * ptr)
{
  printf("Deallocate\n");
  delete ptr;
}

我希望为结构分配的内存自动释放

为此,我写了一个模板

template <class T>
class scoped_del
{
 public:
  scoped_del(T * p, void (*mfree)(T *)) :
   p_(p),
   mfree_(mfree)
  {
  }

  ~scoped_del()
  {
   mfree_(p_);
  }

 private:

  T * p_;

  void (*mfree_)(T *);
};

并像那样使用

int main()
{
  myStruct * st = myStruct_new();

  class scoped_del<myStruct> ptr_st(st, myStruct_free);

  return 0;
}

如何使用stl或boost更加标准化?

2 个答案:

答案 0 :(得分:3)

Boost的shared_ptr在几乎相同的代码中完全相同。

#include <boost/shared_ptr.hpp>

main() {
    boost::sshared_ptr<myStruct> ptr_st(myStruct_new(), myStruct_free);

    ptr_st->a = 11;
}

但您应该考虑是否要编写C ++代码或C代码。您在声明前使用了一些非常C风格的语法(typdef structclass,使用“新函数”而不是构造函数,使用“自由函数”而不是析构函数),但是你标记了这个C ++,显然你正在使用一些C ++特性。如果您想使用C ++,请使用它的所有功能,如果您不想这样做,那么请坚持使用C.将两者混合太多会对任何试图找出代码的人造成很大的混淆(和你的“设计决定”)。

答案 1 :(得分:1)

我知道这是一个老帖子,但我刚发现它,我认为其他人也可能。我也在寻找一个auto_ptr样式的智能指针,但它带有一个删除对象,出于与OP相同的原因,我也使用openssl库并想要包装资源。我正在使用boost::shared_ptrdeleters()来管理openssl对象,但我发现你必须要小心,因为有些openssl调用取决于你传递它们的指针。如果将其存储在shared_ptr中,则可能会导致问题,因为最终会出现双删除方案。此外,在语义上我实际上并不想与任何人“共享”此对象的所有权。我的用法是“我拥有它”或“我想把它交给别人”。

新的C ++ 0x unique_ptr<>可能会提供一个解决方案,但同时使用shared_ptr小心地使用openssl对象,它可能会让你感到厌烦。