1

假设我有这个结构:

    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++ 的“新”。但是,我整天都在为此挠头。

似乎它不起作用的唯一原因是因为我在 initializeFoo() 中设置了这些值。但是,这对我来说没有意义。

还有其他人对这里可能发生的事情有更好的看法吗?

4

3 回答 3

3

你可能是说

void initializeFoo(Foo **foo) {
        *foo = (Foo*)malloc(sizeof(Foo));
        (*foo)->a=0;
        (*foo)->b=15;
        (*foo)->c=0;
    }
于 2013-03-07T07:49:45.500 回答
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;
}
于 2013-03-07T07:49:29.417 回答
2

甚至指针也是按值传递的 像所有输出参数一样,它们必须通过地址 ( &var) 或在 C++ 中传递,参数可以是引用类型(在这种情况下是指针引用类型)。后者可能更好,更不用说最小的变化了:

改变这个:

void initializeFoo(Foo *foo) 

对此:

void initializeFoo(Foo*& foo) // <== note reference-to-pointer

话虽如此,这在实践定义良好的RAII方法的优秀 C++ 程序中没有位置。阅读这个简短的文档,了解如何不应该首先使用指针来拥有资源。最终,您的foo成员应该是一个智能指针,如果不是一个直接的对象实例。

于 2013-03-07T08:05:03.933 回答