【问题标题】:C++ tr1 shared_ptr with custom allocator and deleter带有自定义分配器和删除器的 C++ tr1 shared_ptr
【发布时间】:2012-05-21 13:56:04
【问题描述】:

我正在使用 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 不直接返回malloc 的值,而不是通过指向指针的指针?
  • 在 C++ 中这样做有什么理由吗?您是否考虑过重载运算符new 和delete?
  • deleteFoo 没有释放任何内存! …
  • @Konrad:我省略了实际释放内存的代码:评论中提到了。
  • @SethCarnegie:没有特别的原因 - 这就是我找到代码的方式。

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


【解决方案1】:

如果您无法更改 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 案例,它是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    相关资源
    最近更新 更多