C++ 创建对象指针数组C++;

C++ 创建对象指针数组C++;,c++,new-operator,C++,New Operator,我想创建一个数组,其中包含指向多个对象的指针,但我事先不知道将包含多少个对象,这意味着我需要为数组动态分配内存。我想到了下一个代码: ants = new *Ant[num_ants]; for (i=1;i<num_ants+1;i++) { ants[i-1] = new Ant(); } ants=new*Ant[num_ants]; 对于(i=1;istd::vector ants(num_ants); 调整蚂蚁的大小(新的蚂蚁数量); 行吗 std::vector&l

我想创建一个数组,其中包含指向多个对象的指针,但我事先不知道将包含多少个对象,这意味着我需要为数组动态分配内存。我想到了下一个代码:

ants = new *Ant[num_ants];
for (i=1;i<num_ants+1;i++)
{
    ants[i-1] = new Ant();
}
ants=new*Ant[num_ants];
对于(i=1;i
std::vector ants(num_ants);
调整蚂蚁的大小(新的蚂蚁数量);
行吗

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

但是,如果可能,应使用向量:

#include <vector>

std::vector<Ant*> ants;
for (int i = 0; i < num_ants; ++i) {
    ants.push_back(new Ant());
}
#包括
病媒蚂蚁;
对于(int i=0;i
如果必须使用动态分配的数组,则我更喜欢以下语法:

typedef Ant* AntPtr;
AntPtr * ants = new AntPtr[num_ants];
for (int i = 0; i < num_ants; ++i) {
    ants[i] = new Ant();
}
typedefant*AntPtr;
AntPtr*ants=新的AntPtr[num_ants];
对于(int i=0;i
但是忘记所有这些。代码仍然不好,因为它需要手动内存管理。要解决这一问题,您可以将代码更改为:

std::vector<std::unique_ptr<Ant>> ants;
for (auto i = 0; i != num_ants; ++i) {
    ants.push_back(std::make_unique<Ant>());
}
std::向量蚂蚁;
对于(自动i=0;i!=num_ants;++i){
ants.push_back(std::make_unique());
}
最重要的是:

std::vector<Ant> ants(num_ants);
std::向量蚂蚁(num_ants);
std::向量蚂蚁(num_ants);
for(int i=0;i!=num_ants;++i){
蚂蚁[i]=新蚂蚁;
}
或者如果您不知道提前多少次:

std::vector<Ant*> ants;
while ( moreAntsNeeded() ) {
    ants.push_back( new Ant );
}
std::向量蚂蚁;
while(moreantsneed()){
蚂蚁。推回(新蚂蚁);
}
另一方面,我认为你需要问问自己
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();
}

对于(i=0;i您真的需要保留指向项的指针吗?如果您可以按值使用对象,一种更简单的方法是使用向量:
std::vector 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());
struct CreateAnt
{
Ant*运算符()()常量{返回新Ant;}
};
std::vector ants(num_ants);//使用空指针创建向量。
std::generate(ants.begin()、ants.end()、CreateAnt());

@Carl Norum;我现在无法尝试,因为我才刚开始编写代码,还缺少很多部分。您可能需要将循环更改为从0迭代到num_ants,然后分配给ants[I]。无需将所有内容偏移1。没有理由不能使用伪空类进行尝试。只需创建一个不包含任何内容的类Foo,并使用相同的逻辑即可。您确定上述代码有效吗?当我在Visual Studio中编写以下内容时,我收到一个编译器错误:Ant**ants=new*Ant[5]语法错误:“*”不应该是代码>蚂蚁* =新的蚂蚁* [NuMangts ];< /C> >我不是C++专家,但我认为这是一个错误。如果OP想用蚂蚁来做指针,声明将是:<代码> STD::向量ANTION指针(数字)
您还必须使用
std::generate
new
所有相应的项目。我投了反对票,因为OP直接提到他想使用指针,正如@ThomasMatthews所提到的,需要不同的声明。不过,您的答案适用于不同的情况。我投了反对票,因为OP显然不知道a对象数组是一个更好的选择你真的能把
new
的结果分配给数组吗?@Mark B:捕捉得好。修复了它。所以基本上
new Ant*[num\u ants]
是一个假调用,因为它根本不调用构造函数。只分配指针数组。这就是为什么
new
看起来好像调用了两次。为什么“应该”可以使用std::vector吗?值得注意的是,如果Ant类是其他类的基类,并且该派生类的实例也可以存储在Ants数组中,则后一种方法(
std::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());