假设我有这个结构:
typedef struct Foo {
int a;
int b;
int c;
} Foo;
现在,我创建了这个初始化函数,它将为Foo分配内存,并将值预设到我的对象中,如下所示:
void initializeFoo(Foo *foo) {
foo = (Foo*)malloc(sizeof(Foo));
foo->a=0;
foo->b=15;
foo->c=0;
}
在Foo之上,假设我们创建了一个名为Display的C ++类,因此我们可以在屏幕上显示Foo。
class Display {
public:
Display();
private:
Foo* foo;
}
在Display构造函数内部,我使用initializeFoo(foo)来初始化foo的值,但是我为foo设置的预设值不存在。
我认为这可能是内存分配问题。我确保Display正确地分配了C ++的'new'。但是,我一整天都在摸不着头脑。
似乎它无法工作的唯一原因是因为我在initializeFoo()中设置了这些值。但是,这对我来说没有意义。
其他人对这里可能发生的事情有更好的看法吗?
答案 0 :(得分:3)
你可能意味着
void initializeFoo(Foo **foo) {
*foo = (Foo*)malloc(sizeof(Foo));
(*foo)->a=0;
(*foo)->b=15;
(*foo)->c=0;
}
答案 1 :(得分:2)
您将Foo
指针按值传递给initializeFoo
,因此无法修改调用者的指针。如果你想要这种初始化器,你需要将指针传递给指针:
void initializeFoo(Foo **foo) {
*foo = malloc(sizeof(Foo));
(*foo)->a=0;
(*foo)->b=15;
(*foo)->c=0;
}
但是,在这种情况下,如果您只是简单地返回Foo*
,则会更容易:
Foo *initializeFoo() {
Foo* foo = malloc(sizeof(Foo));
foo->a=0;
foo->b=15;
foo->c=0;
return foo;
}
答案 2 :(得分:2)
偶数指针按值传递与所有out参数一样,它们必须通过地址(&var
)或C ++传递,参数可以是引用类型(在本例中是引用 - 指针类型)。后者可能更好,更不用说最小的改变了:
改变这个:
void initializeFoo(Foo *foo)
对此:
void initializeFoo(Foo*& foo) // <== note reference-to-pointer
话虽这么说,但在一个很好的C ++程序中没有地方可以实现定义良好的RAII方法。阅读this brief document,了解您不应该首先使用指针来拥有资源。最终,您的foo
成员应该是智能指针,如果不是直接的对象实例。