将shared_ptr作为指针指向

时间:2017-08-31 10:18:50

标签: c++ pointers

我有一个C签名

的C函数
ldap_initialize LDAP_P((LDAP **ldp, LDAP_CONST char *url ));

我像这样使用它

LDAP *ld;
ldap_initialize(&ld, "host_name");

它工作正常。

我想将ld更改为像这样的共享指针。

  std::shared_ptr<LDAP> ldap(ld, [](LDAP * ld){ ldap_unbind(ld); });

并传递给ldap_initialize。

ldap_initialize(&ldap.get(), "host_name");

但上面的代码不起作用。 有没有办法将shared_pointer或unique_ptr作为c样式指针传递给指针。

2 个答案:

答案 0 :(得分:5)

你倒退了。您初始化一个原始指针并将其传递给std::shared_ptr来管理:

auto get_shared_ldap(char const* url) {
  LDAP *ld;
  ldap_initialize(&ld, url);

  if (/*error occured*/) {
    // Consider throwing something
    return std::shared_ptr<LDAP>{};
  }
  return std::shared_ptr<LDAP>(ld, [](LDAP * ld){ ldap_unbind(ld); });
}

您无法分配std::shared_ptr的内部状态。您正在尝试在代码示例中执行此操作。

答案 1 :(得分:1)

你正在做什么不起作用,因为shared_ptr.get()(据我所知)使用指针参数来返回一个值。但是ld*会返回&ldap.get()。请注意,这是托管指针的副本,而不是对它的引用。因此,行shared_ptr尝试将地址设置为临时地并且正确地失败。 LDAP *ld; ldap_initialize(&ld, "host_name"); if (ld) std::shared_ptr<LDAP> ldap(ld, [](LDAP * ld){ ldap_unbind(ld); }); else // This is up to you 无法获取对其内部指针的引用,因为允许外部源修改其内部会破坏其安全内存管理。

你想要做的是这个

ldap_initialize

这种方法有效并且安全的原因是ld只有在成功时才会返回LDAP的有效值。你没有在它之外创建ldap_initialize,并且在shared_ptr的返回和shared_ptr<LDAP>的创建之间没有任何东西可以抛出,因此你无法获得内存泄漏。当然,你所希望的更加冗长,但你总是可以通过在返回div的函数内部进行初始化来缓解这种情况。