1

我得到了以下代码,其中循环创建了 100 个对象。

我的问题是,

  • 为什么我需要在new这里使用,因为我事先已经知道我需要多少内存。
  • 是否有与我的示例代码相同但没有动态内存分配的代码?(并且不使用 std 容器,例如vector)(...class + dynamic momery 一起变得令人困惑)

示例代码:

class Particle {...};
Particle *myParticles[ 100 ];

for( int i = 0; i < 100; i++ )
{   
    myParticles[ i ] = new Particle(x,y);          //x and y are randomized for each loop
}

[更新]: class Particle没有默认构造函数。因此Particle myParticles[ 100 ];将不起作用。请注意,可以通过设置默认构造函数,然后创建方法来解决此问题Particle::setXY (double x, double y)

但是有没有办法在不创建新方法的情况下解决这个问题?即只使用构造函数,没有动态内存分配。

我只是觉得奇怪,如果没有动态内存分配,这是无法完成的(?)。还是我必须接受这只是 C++ 语言的一个怪癖的事实?

4

5 回答 5

3

您不必使用new. Particle您可以按照自己的建议创建一个 s 数组:

Particle myParticles[100];

问题是,它将是默认构造的,因为您无法指定(x,y)仅在运行时可用的参数。因此,您必须提供在构建 a 之后指定此信息的方法Particle,例如:

for( int i = 0; i < 100; i++ )
{   
    myParticles[i].SetCoords(x,y);          //x and y are randomized for each loop
}

这需要默认构造函数和在构造后配置实例Particle的方法。因此,如果代码超出您的控制范围SetCoords,它可能不是一个选项。Particle

但我真的会考虑使用vector,因为它是一个非常方便和有用的东西。如果编程正确,它将非常有效,因为它使用很少数量的动态分配。例如:

vector<Particle> myParticles;

myParticles.reserve(100);
for( int i = 0; i < 100; i++ )
{   
    myParticles.push_back(Particle(x,y));          //x and y are randomized for each loop
}

这应该只使用一个分配。这假设它Particle是相当轻量级的,可以被复制构造函数复制。

于 2013-04-12T09:05:44.813 回答
1
Particle myParticles[ 100 ];

将使用默认构造函数 100 次而不是Particle(x,y)

因此,真正的问题是您无法将参数传递给数组中的构造函数。

如果Particle没有默认构造函数 Particle myParticles[ 100 ];将不会编译

我们需要更多信息。可能是粒子很大,但我们想对数组进行排序。拥有一个指针数组,您可以交换它,这可能比交换粒子快得多。粒子交换的实现绝非易事。最后,您可以通过复制这些指针来传递调用其他函数的数组……这很复杂。

于 2013-04-12T09:04:15.080 回答
1

为什么我需要在这里使用 new ,因为我事先已经知道我需要多少内存?

原因可能是这段代码存在于一个函数中。创建函数本地的数组并返回指向它的指针/引用将导致未定义的行为。所以也许原因是显式管理创建的数组元素的生命周期。除非您显示更多代码,否则无法准确判断。

是否有与我的示例代码相同但没有动态内存分配的代码?

一般来说,如果可以选择,

Particle myParticle[100];

比使用动态内存分配更好,更不容易出错。

好读:
为什么 C++ 程序员应该尽量减少“新”的使用?

new请注意,虽然尽可能地限制使用是好的,但存在的目的new是因为它在某些更适合所需行为的情况下是必需的。所以它更像是一匹马。

于 2013-04-12T09:00:04.110 回答
0

作为一名 C 程序员,我会这样做:

char particle_space[sizeof(Particle) * 100];
Particle *myParticles = (Particle *) particle_space;

然后按以下方式填写:

for (int i = 0; i < 100; i++)
    myParticles[i] = Particle(i, i);

我不知道sizeof在声明中使用是否是可移植的,或者它是否是 gcc 的扩展,但这对我有用。

于 2013-04-12T12:09:21.070 回答
-1
Particle *myParticles[ 100 ];

是粒子指针数组,而不是粒子。而 myParticles 类型是 Particle** 而不仅仅是 Particle*,这就是您需要分配内存的原因。

Particle myParticles[ 100 ];

确实会创建一个粒子数组,并且不需要内存分配。

于 2013-04-12T09:00:53.337 回答