将共享_ptr作为指针指向指针
Pass shared_ptr as pointer to pointer
i具有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");
,但以上代码不起作用。是否有任何方法将共享_pointer或unique_ptr作为C样式指针转换为指针。
您将其倒退。您初始化一个原始指针并将其传递给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
的内部状态。这是您要在代码样本中尝试做的。
您正在做的事情不起作用,因为ldap_initialize
(从我能告诉的)使用指针参数返回值。但是shared_ptr.get()
返回ld*
。请注意,这是托管指针的副本,而不是对其的引用。因此,&ldap.get()
行试图将地址置于临时,正确失败。shared_ptr
无法提供参考其内部指针的参考,因为允许外部来源修改其Inards会破坏其安全的内存管理。
您想做的是这个
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>
的函数中初始化来减轻它。
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址