我得到了以下代码,其中在循环中创建了100个对象。
我的问题是,
new
,因为我事先已经知道需要多少内存。vector
之类的标准容器)(...类+动态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
}
[UPDATE]:
class Particle
没有默认构造函数。因此Particle myParticles[ 100 ];
将不起作用。请注意,通过设置默认构造函数,然后创建方法Particle::setXY (double x, double y)
,可以解决此问题。
但有没有办法在不创建新方法的情况下解决这个问题?即只使用构造函数,而没有动态内存分配。
我觉得很奇怪,没有动态内存分配就无法完成(?)。或者我必须接受这个只是C ++语言的怪癖的事实吗?
答案 0 :(得分:3)
您不必使用new
。您可以按照自己的建议创建一个Particle
的数组:
Particle myParticles[100];
问题是,它将是默认构造的,因为您无法指定仅在运行时可用的(x,y)
参数。因此,您必须提供在构造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
相当轻量级,可以被复制构造函数复制。
答案 1 :(得分:1)
为什么我需要在这里使用new,因为我事先已经知道需要多少内存?
原因是这段代码可能存在于一个函数中。创建函数本地的数组并返回对它的指针/引用将导致未定义的行为。所以也许原因是明确管理创建的数组元素的生命周期。除非您显示更多代码,否则无法准确说出。
是否存在与我的示例代码相同的代码,没有动态内存分配?
一般情况下,如果有选择,
Particle myParticle[100];
与使用动态内存分配相比,更好,更不容易出错。
好读:
Why should C++ programmers minimize use of 'new'?
请注意,尽管尽可能限制new
的使用是好的,但new
的存在目的是因为在某些情况下需要它更适合行为期望。所以它更适合课程。
答案 2 :(得分:1)
Particle myParticles[ 100 ];
将使用默认构造函数100次而不是Particle(x,y)
所以,真正的问题是你无法将参数传递给数组中的构造函数。
如果Particle
没有默认构造函数Particle myParticles[ 100 ];
将无法编译
我们需要更多信息。可能是粒子很大,但我们想要对数组进行排序。有一个指针数组,你可以交换它,这可能比交换粒子快很多。粒子交换的实现可能远非微不足道。 最后,您可以传递调用其他函数的数组,并复制这些指针......这很复杂。
答案 3 :(得分: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的扩展但是对我有用。
答案 4 :(得分:-1)
Particle *myParticles[ 100 ];
是粒子指针数组,而不是粒子。而myParticles类型是粒子**而不仅仅是粒子*,这就是你需要分配内存的原因。
Particle myParticles[ 100 ];
确实会创建一个Particle数组,并且不需要mem分配。