2011-05-04 229 views
8

我想創建一個數組,其中包含指向許多對象的指針,但事先並不知道要保存的對象的數量,這意味着我需要動態分配內存陣列。我已經想好了下一個代碼:創建對象指針數組C++

ants = new *Ant[num_ants]; 
for (i=1;i<num_ants+1;i++) 
{ 
    ants[i-1] = new Ant(); 
} 

其中ants被定義爲Ant **ants;Ant是一類。

它會工作嗎?

+3

你試過了嗎? – 2011-05-04 17:47:21

+0

@Carl Norum;目前我無法嘗試,因爲我只開始編寫代碼,而且還缺少很多部分。 – SIMEL 2011-05-04 17:48:44

+2

您可能想要更改循環以從0到num_ants進行迭代,並將其分配給螞蟻[i]。沒有必要通過1來抵消所有東西。 – 2011-05-04 17:50:15

回答

15

Will it work?

是。如果你必須使用一個動態分配的數組,那麼我寧願這句法

#include <vector> 

std::vector<Ant*> ants; 
for (int i = 0; i < num_ants; ++i) { 
    ants.push_back(new Ant()); 
} 

typedef Ant* AntPtr; 
AntPtr * ants = new AntPtr[num_ants]; 
for (int i = 0; i < num_ants; ++i) { 
    ants[i] = new Ant(); 
} 

卻忘記了所有的

然而,如果可能的話,你應該使用一個載體。代碼仍然不太好,因爲它需要手動內存管理。爲了解決這個問題,你可以對你的代碼更改爲:

std::vector<std::unique_ptr<Ant>> ants; 
for (auto i = 0; i != num_ants; ++i) { 
    ants.push_back(std::make_unique<Ant>()); 
} 

而最重要的是簡單:

std::vector<Ant> ants(num_ants); 
+0

你真的可以將'new'的結果分配給一個數組嗎? – 2011-05-04 18:03:13

+0

@Mark B:好的。修復。 – StackedCrooked 2011-05-04 20:26:10

+0

所以基本上'新的Ant * [num_ants]'是一個虛假的調用,因爲它不會調用構造函數嗎?只分配指針數組。這就是爲什麼'新'似乎被稱爲兩次。 – Ciantic 2012-05-24 12:30:40

4
std::vector<Ant> ants(num_ants); 
ants.resize(new_num_ants); 
+4

如果OP想要使用指向螞蟻的指針,聲明將是:'std :: vector ant_pointers(num_ants);' – 2011-05-04 17:51:14

+0

您還必須將'std :: generate'用於'new'所有相應的項目。 – 2011-05-04 18:03:55

+0

我投票,因爲OP直接提到他想使用指針,作爲@ThomasMatthews提到,需要一個不同的聲明。儘管你的答案對另一種情況很有幫助。 – Purefan 2014-05-02 08:20:42

2
std::vector<Ant*> ants(num_ants); 
for (int i = 0; i != num_ants; ++ i) { 
    ants[i] = new Ant; 
} 

或者,如果你不知道有多少提前:

std::vector<Ant*> ants; 
while (moreAntsNeeded()) { 
    ants.push_back(new Ant); 
} 

另一方面,我認爲你需要問自己: Ant是一個實體類型還是一個值。如果它是一個值,你可能會想跳過指針和動態分配; 如果它是一個實體類型,則必須考慮該對象的生命週期以及何時何地將被刪除。

2

是的,這是一般的想法。但是,還有其他選擇。你確定你需要一個指針數組嗎?類Ant的一組對象可能就足夠了。在你只需要分配數組:

Ant *ants = new Ant[num_ants]; 

在一般情況下,你應該更喜歡使用std::vector使用數組。一個向量可以根據需要增長,並且會爲你處理內存管理。

在您發佈的代碼中,您必須在循環中刪除ants的每個元素,然後刪除陣列本身delete [] ant。請記住deletedelete []之間的差異。

還有一點,因爲在C++數組的下標是0類,以下約定被用於迭代的元素:

for (i=0; i<num_ants; i++) 
{ 
    ants[i] = new Ant(); 
} 

這使得代碼更可讀。

3

你真的需要持有指針的項目?如果您可以按值使用對象,則更簡單的方法是使用矢量:std::vector<Ant> ants(num_ants);。那麼不僅不需要編寫循環,而且您也不必擔心來自原始指針和其他對象管理項目的內存泄漏。

如果您需要對象指針來說滿足API,您仍然可以使用vector作爲外部容器並手動分配對象。

struct CreateAnt 
{ 
    Ant* operator()() const { return new Ant; } 
}; 

std::vector<Ant*> ants(num_ants); // Create vector with null pointers. 
std::generate(ants.begin(), ants.end(), CreateAnt());