我有一个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样式指针传递给指针。
答案 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
的函数内部进行初始化来缓解这种情况。