我正在使用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>

最佳答案

如果您不能更改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情况,它是相同的。

10-08 08:15