我正在使用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>
?
答案 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情况它是相同的。