2013-03-07 56 views
1

比方說,我有這樣的結構:設定值

typedef struct Foo { 
     int a; 
     int b; 
     int c; 
    } 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; 
    } 

顯示器內部構造的我用initializeFoo(富)來初始化自己的價值觀foo的,但是我已經爲富設定的預設值是不存在的。

我認爲這可能是一個內存分配問題。我確信Display正確地分配了C++的'新'。不過,我一整天都在撓頭。

它似乎是它不工作的唯一原因是因爲我在initializeFoo()中設置了這些值。但是,這對我來說沒有意義。

其他人對這裏會發生什麼有更好的意見?

+0

你使用'C'還是'C++'?因爲你在這裏看起來像一個非常不健康的混合物。 – 2013-03-07 08:28:38

+0

@Matthieu我只爲我的驅動程序使用C++。其他代碼必須嚴格使用C++ – 2013-03-07 11:11:03

回答

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; 
} 
3

你大概意思

void initializeFoo(Foo **foo) { 
     *foo = (Foo*)malloc(sizeof(Foo)); 
     (*foo)->a=0; 
     (*foo)->b=15; 
     (*foo)->c=0; 
    } 
2

即使指針是按值傳遞像所有的輸出參數,它們必須由地址(&var)傳遞或C++中,PARAMET呃可以是一個引用類型(在這種情況下是引用指針類型)。這些後者可能是更好的,更何況最小的變化:

更改此:

void initializeFoo(Foo *foo) 

要這樣:

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

話雖這麼說,這有一個很好的無處C++程序實踐良好定義RAII方法論。請閱讀this brief document關於如何不應該首先使用指針來擁有資源。最終你的foo成員應該是一個智能指針,如果不是一個完整的對象實例。