我正在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);
我目前仅使用new
和delete
来创建结构,填充结构并将它们传递给方法。
我想在我的C ++程序中使用智能点。我可以创建智能点并将它们传递给函数时将其转换为原始指针吗?
因此,我不需要致电delete
。
答案 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进行内存管理了,其他表达的担忧不是问题吗?