给出一些结构:
struct Foo {
// ...
};
我想使用具有以下签名的库中的函数:
void getAllFoos(Foo** foos);
基本上,该函数应该返回所有Foos的向量,但是有人决定使用指针到指针的目的是返回某些东西。我必须给函数添加一些空的Foo **,以便可以填充它。
要调用该函数时,如何初始化foos
? “空指针”(Foo **)是否足够,还是我必须先获取foos的数量并自己分配足够的内存(如何为指针指向指针?)?谁负责释放内存?
答案 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());