0

我正在使用 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(...)
}

如何声明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返回 ashared_ptr使得忘记设置正确的删除函数变得更加困难。

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

于 2012-05-21T14:12:48.753 回答