3

私は構造を持っています

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を使用して、より標準的な方法にするにはどうすればよいですか?

4

2 に答える 2

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を使用します。2つを混合しすぎると、コードを理解しようとする人にとっては多くの混乱を招きます(および「設計上の決定」)。

于 2010-07-16T10:29:55.037 に答える
1

私はこれが古い投稿であることを知っていますが、私はそれを見つけたばかりで、おそらく他の人もそうするだろうと思います。また、スタイルのスマートポインターを探していauto_ptrますが、これはdeleterオブジェクトを取り、OPと同じ理由で、opensslライブラリも使用しており、リソースをラップしたいと考えています。私はopensslオブジェクトの管理にswithを使用boost::shared_ptrdeleters()ていますが、openssl呼び出しの一部は、渡したポインターの所有権を取得するため、注意が必要な難しい方法を見つけました。これは、に保存している場合に問題を引き起こす可能性があります。これshared_ptrは、二重削除のシナリオになってしまうためです。また、意味的には、このオブジェクトの所有権を他の人と「共有」したくありません。私の用法は「私はそれを所有している」または「私はそれを他の誰かに与えたい」のどちらかでした。

新しいC++0xunique_ptr<>は解決策を提供するかもしれませんがshared_ptr、それまでの間、opensslオブジェクトを注意深く使用すると、噛み付く可能性があります。

于 2011-11-17T17:28:30.350 に答える