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

问题描述 投票:2回答:3

我在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++ pointers smart-pointers
3个回答
4
投票

如果需要动态分配数组,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之后调用构造函数。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.