C ++ tr1 shared_ptr与自定义分配器和删除器

时间:2012-05-21 13:56:04

标签: c++ memory-management constructor shared-ptr

我正在使用tr1 shared_ptr(工作尚未更新到C ++ 0x或C ++ 11),我需要 将std :: tr1 :: shared_ptr与具有自定义分配器和删除器的类Foo一起使用。

目前,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(...)
}

如何使用createFoo和deleteFoo声明std::tr1::shared_ptr<Foo>

1 个答案:

答案 0 :(得分: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会让忘记设置正确的删除功能变得更加困难。

我在我的示例中使用了shared_ptr的C ++ 11标头/命名空间,但对于TR1 / Boost情况它是相同的。