指向Pointer的指针作为getter的函数参数

时间:2018-11-21 08:31:11

标签: c++ pointers

给出一些结构:

struct Foo {
  // ...
};

我想使用具有以下签名的库中的函数:

void getAllFoos(Foo** foos);

基本上,该函数应该返回所有Foos的向量,但是有人决定使用指针到指针的目的是返回某些东西。我必须给函数添加一些空的Foo **,以便可以填充它。

要调用该函数时,如何初始化foos? “空指针”(Foo **)是否足够,还是我必须先获取foos的数量并自己分配足够的内存(如何为指针指向指针?)?谁负责释放内存?

3 个答案:

答案 0 :(得分:3)

foos不需要初始化,如果可以假设getAllFoos可以这样工作–它会为您初始化foos:< / p>

void getAllFoos(Foo** pfoos) {
    Foo* the_pointer_to_all_the_foos;
    // (1) maybe the_pointer_to_all_the_foos = malloc(10 * sizeof(Foo));
    // (2) maybe the_pointer_to_all_the_foos = new Foo[10];
    // (3) maybe the_pointer_to_all_the_foos is a static Foo[10]
    *pfoos = the_pointer_to_all_the_foos;
}

使用上述API,getallFoos没有理由读取pfoos的值。

要使用它:

// in C, you should write: struct Foo* foos;
Foo* foos;
getAllFoos(&foos); // note: foos is Foo*, pfoos is Foo**

通常,getAllFoos的API文档必须最终记录您需要对foos进行的操作。根据代码的作用[[(1)(2)(3),或从上方进行的其他操作],您可能需要free(foos)delete[] foos,不执行任何操作,或做其他事情。我们不能用问题中给出的信息来回答。

答案 1 :(得分:0)

您应该通过传递类型为struct Foo的指针的引用来调用该函数。

struct Foo *foo = NULL;
getAllFoos(&foo);

您可以按以下方式释放foo

free(foo); //Assuming getAllFoos allocated the memory and filled.


  

“空指针”(Foo **)就足够了

任何FOO *都不应指向有效内存。

struct Foo **foo = NULL; getAllFoos(foo);

如果getAllFoos试图解除对foo的引用,您将有未定义的行为。

答案 2 :(得分:0)

您需要事先知道您将获得多少Foo。如果您一次获得所有Foo,就无法解决这个问题,并且这在接口中是硬连线的。但是,如果您负责分配内存,您可以做的是使用std::vector作为接收者,并将其data()成员作为参数:

std::vector<Foo> flexible_buffer(Foo_nb); // or reserve later
getAllFoos(&(flexible_buffer.data());