0

私はtr1shared_ptr(C++0xまたはC++11にまだ更新されていない作業)を使用しており、カスタムアロケーターと削除機能を持つクラスFooでstd :: tr1::shared_ptrを使用する必要があります。

現在、Fooは次のコードによって割り当て/割り当て解除されています。

void createFoo(Foo** mem) {
 *mem = (Foo *) malloc(sizeof(Foo));
  memset(*mem, 0, sizeof(Foo));
}

void deleteFoo(Foo* mem) {
  // code to call recursive methods to delete Foo substructures
  memset(...)
}

std::tr1::shared_ptr<Foo>createFooとdeleteFooを使用して宣言するにはどうすればよいですか?

4

1 に答える 1

4

変更できない場合createFoo(これが望ましい)、をラップしcreateFooてそのダブルポインタを非表示にします。

#include <memory>

struct Foo {};

void createFoo(Foo **p) { *p = new Foo; }
void deleteFoo(Foo *p) { delete p; }

std::shared_ptr<Foo> wrapCreateFoo() {
  Foo *p = NULL;
  createFoo(&p);
  return std::shared_ptr<Foo>(p, deleteFoo);
}

int main() {
  std::shared_ptr<Foo> f = wrapCreateFoo();
}

wrapCreateFooを返すshared_ptrと正しい削除機能を設定するのを忘れにくくなるので、すべてを1か所で行いました。

この例ではC++11ヘッダー/名前空間を使用しshared_ptrましたが、TR1/Boostの場合も同じです。

于 2012-05-21T14:12:48.753 に答える