使用 c 库的 C++ 程序 - 将智能指针转换为原始 c 样式指针?

Posted

技术标签:

【中文标题】使用 c 库的 C++ 程序 - 将智能指针转换为原始 c 样式指针?【英文标题】:C++ program using a c library - Converting a smart pointer to a raw c style pointer? 【发布时间】:2019-02-21 12:01:27 【问题描述】:

我在 c++ 程序中使用 c 库。

库中的函数需要指向数组和标量的指针作为参数,例如:

int PartGraphKway(idx t *nvtxs, idx t *ncon, idx t *xadj, idx t *adjncy,
    idx t *vwgt, idx t *vsize, idx t *adjwgt, idx t *nparts, real t *tpwgts,
    real t ubvec, idx t *options, idx t *objval, idx t *part);

我目前只使用newdelete 来创建结构、填充它们并将它们传递给方法。

我想在我的 C++ 程序中使用智能点。我可以创建智能点并在将它们传递给函数时将它们转换为原始指针吗?

因此,我不需要致电delete

【问题讨论】:

C++ 非常灵活:您可以使用它来发明语言本身之外不存在的人为问题。或者,您可以使用您最喜欢的无错误容器类并专注于编写实际程序。 【参考方案1】:

std::vector 如果您需要动态分配数组,可能是一个不错的选择。您可以使用std::vector::data 获取指向内部缓冲区的原始指针。

例子:

std::vector<t> nvtxs(....);
PartGraphKway(nvtxs.data(), ....);
// no need to call delete; vector takes care of memory

【讨论】:

【参考方案2】:

这取决于谁释放指针。如果 C++ 代码释放它,那么std::unique_ptr::get() 将提供原始指针,当unique_ptr 对象被销毁时,该对象仍然会被自动释放。

如果 C 代码获得了指针的所有权,那么最终它将使用free() 来释放内存。您可以调用std::unique_ptr::release() 让智能指针放弃其对象所有权。 您还必须使用 malloc(而不是 new)创建指针,并将自定义删除器传递给 std::unique_ptr,以调用 free(ptr)。如果对象有构造函数,则必须调用placement new,以便在malloc 之后调用构造函数。

【讨论】:

我认为这个问题读得太多了。我很确定 c 函数不会释放对象。因此::get() 和一个更简单的答案就足够了。 @MikeVine 问题明确表示因此,我不需要致电delete 是的,当我读到它时,被调用者在调用后调用 delete。 @MikeVine 被调用者是用 C 语言编写的,因此被调用者调用 free()。在new之后调用free是UB。 @eerorika 我已更新答案以反映您的担忧。【参考方案3】:

是的,您可以按照自己的方式使用智能指针。 unique_ptr 和 shared_ptr 都可以让您读取原始指针并将其作为零努力的参数传递。

鉴于您已经在使用 new 和 delete 进行内存管理,其他表达的担忧不是问题吗?

【讨论】:

以上是关于使用 c 库的 C++ 程序 - 将智能指针转换为原始 c 样式指针?的主要内容,如果未能解决你的问题,请参考以下文章

C++程序员宝典

C++|深入理解智能指针

如何使用 C++ lambda 将成员函数指针转换为普通函数指针以用作回调

C++基础语法梳理:智能指针和强制类型转换运算符

C ++:将void *转换为基类指针时访问冲突

C++ 将指针转换为指针 (x**) -> (y**)