2011-05-04 78 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());