我想创建一个数组,其中包含指向许多对象的指针,但事先并不知道要保存的对象的数量,这意味着我需要动态分配内存阵列。我已经想好了下一个代码:创建对象指针数组C++
ants = new *Ant[num_ants];
for (i=1;i<num_ants+1;i++)
{
ants[i-1] = new Ant();
}
其中ants
被定义为Ant **ants;
和Ant
是一类。
它会工作吗?
我想创建一个数组,其中包含指向许多对象的指针,但事先并不知道要保存的对象的数量,这意味着我需要动态分配内存阵列。我已经想好了下一个代码:创建对象指针数组C++
ants = new *Ant[num_ants];
for (i=1;i<num_ants+1;i++)
{
ants[i-1] = new Ant();
}
其中ants
被定义为Ant **ants;
和Ant
是一类。
它会工作吗?
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);
你真的可以将'new'的结果分配给一个数组吗? – 2011-05-04 18:03:13
@Mark B:好的。修复。 – StackedCrooked 2011-05-04 20:26:10
所以基本上'新的Ant * [num_ants]'是一个虚假的调用,因为它不会调用构造函数吗?只分配指针数组。这就是为什么'新'似乎被称为两次。 – Ciantic 2012-05-24 12:30:40
std::vector<Ant> ants(num_ants);
ants.resize(new_num_ants);
如果OP想要使用指向蚂蚁的指针,声明将是:'std :: vector
您还必须将'std :: generate'用于'new'所有相应的项目。 – 2011-05-04 18:03:55
我投票,因为OP直接提到他想使用指针,作为@ThomasMatthews提到,需要一个不同的声明。尽管你的答案对另一种情况很有帮助。 – Purefan 2014-05-02 08:20:42
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
是一个实体类型还是一个值。如果它是一个值,你可能会想跳过指针和动态分配; 如果它是一个实体类型,则必须考虑该对象的生命周期以及何时何地将被删除。
是的,这是一般的想法。但是,还有其他选择。你确定你需要一个指针数组吗?类Ant
的一组对象可能就足够了。在你只需要分配数组:
Ant *ants = new Ant[num_ants];
在一般情况下,你应该更喜欢使用std::vector
使用数组。一个向量可以根据需要增长,并且会为你处理内存管理。
在您发布的代码中,您必须在循环中删除ants
的每个元素,然后删除阵列本身delete [] ant
。请记住delete
和delete []
之间的差异。
还有一点,因为在C++数组的下标是0类,以下约定被用于迭代的元素:
for (i=0; i<num_ants; i++)
{
ants[i] = new Ant();
}
这使得代码更可读。
你真的需要持有指针的项目?如果您可以按值使用对象,则更简单的方法是使用矢量: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());
你试过了吗? – 2011-05-04 17:47:21
@Carl Norum;目前我无法尝试,因为我只开始编写代码,而且还缺少很多部分。 – SIMEL 2011-05-04 17:48:44
您可能想要更改循环以从0到num_ants进行迭代,并将其分配给蚂蚁[i]。没有必要通过1来抵消所有东西。 – 2011-05-04 17:50:15