2010-06-11 118 views
0

尋找一些數組和指針的幫助,以及我正在嘗試做什麼的解釋。 我想在類型爲Foo *的堆上創建一個新數組,以便稍後可以將已經創建的對象分配到此數組的其他位置。當我做類似以下的事情時,我正在麻煩地理解我正在創建的內容。數組和指針

Foo *(*f) = new Foo*[10]; 

此外,一旦我創建了我的數組,我如何訪問每個元素,例如。

(f + 9)->fooMember(); ?????? 

在此先感謝。

回答

3
Foo *(*f) = new Foo*[10]; 

在聲明中括號是不必要的,所以這是一樣的:

Foo **f = new Foo*[10]; 

在任何情況下,new Foo*[10]Foo*小號分配空間,使他們初始化。它返回一個指向數組中第一個Foo*(第零個元素)的指針,該指針指定給f

要訪問數組的元素,您只需使用下標:

f[0] = new Foo; 
f[0]->fooMember(); 

請記住,您創建使用new[]什麼,當你通過指針調用delete[]用它做必須一次釋放。例如:

delete[] f; 

這並不刪除的元素由Foo*在數組中指向。如果使用new創建Foo對象,則必須使用delete它們之前的刪除該數組。例如,不含元素我們創建:

delete f[0]; 
+0

謝謝。如果我想訪問單個元素而不使用[]運算符,但使用指針算術,這看起來如何? – Thomas 2010-06-11 01:54:26

+0

@Thomas:'f [0]'只是'*(f + 0)'的縮寫,例如,您可以執行'(*(f + 0)) - > fooMember()'。 – 2010-06-11 01:56:35

+0

謝謝。第一個使用*的方括號是什麼? – Thomas 2010-06-11 02:05:50

1

您可以用下面的代碼創建數組的指針:

Foo** f = new Foo*[10]; 

然後訪問的元素:

f[9]->fooMember(); 

一定要事後清理:

delete[] f; 

謝謝。

+0

正確的,但我很想念這樣的事實,如果這些三線粘合在一起而成爲一個程序,沒有額外的代碼的系統註釋會最有可能死亡(因爲沒有創建實際的'Foo'對象) – 2010-06-11 07:50:18

1

當你有這種情況,你可能會發現下面的代碼片段有用:

首先初始化:

Foo** f = new Foo*[10]; 
for (int i = 0; i < 10; i++) { 
    f[i] = new Foo; 
} 

然後訪問f數組中的每個元素,這就是你所要求的,但除非你通過調用上述構造函數正確地爲每個成員分配內存,否則你將無法這樣做:

f[9]->fooMember(); 

最後,要保持整潔,防止內存泄漏:

for (int i = 0; i < 10; i++) { 
    delete f[i]; 
} 
delete[] f; 
+0

你應該使用'std :: for_each'來覆蓋顯式編寫的循環。 – 2010-06-11 03:03:13

+1

@Billy ONeal - 假設你打算使用STL。當然,幾乎總是如此,但這仍然是一個假設。 for循環仍然是合法有效的C++。 – 2010-06-11 04:17:53

+0

@Khnle:是的。但是,僅僅因爲某些可能或有效的事情並不意味着它是完成事情的最佳方法。算法調用總是比顯式循環更好。 – 2010-06-11 04:37:20

1

數組和指針都不太C++十歲上下。如何

std::vector<std::shared_ptr<Foo> > f; 
f.push_back(std::make_shared<Foo>(whatever, arguments, you, need)); 
// ... 
f[9]->fooMember(); 
// ... 

無需手動清理需要:-)

+0

當然,shared_ptr還不是C++標準的一部分。 – 2010-06-11 08:26:36

+0

@ Neil是的,但我希望每個有能力的程序員都足夠聰明,以google'shared_ptr'並找到解決方案。如果'std :: shared_ptr'不起作用,'std :: tr1 :: shared_ptr'或者'boost :: shared_ptr'應該做訣竅:) – fredoverflow 2010-06-11 08:47:07