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

时间:2019-02-21 12:01:27

标签: c++ pointers smart-pointers

我正在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

3 个答案:

答案 0 :(得分:4)

如果需要动态分配数组,

std::vector可能是一个不错的选择。您可以使用std::vector::data获取指向内部缓冲区的原始指针。

示例:

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

答案 1 :(得分:2)

这取决于谁释放指针。如果C ++代码将其释放,则std::unique_ptr::get()将提供原始指针,并且unique_ptr对象被销毁后,该对象仍将自动释放。

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

答案 2 :(得分:1)

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

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