繁体   English   中英

如何在没有动态内存分配的情况下创建对象数组

[英]how to create array of objects without dynamic memory allocation

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

我的问题是,

  • 为什么我需要在这里使用new ,因为我事先已经知道我需要多少内存。
  • 是否有一个代码与我的示例代码相同,没有动态内存分配? (并且不使用vector等std容器)(...类+动态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 ++语言的怪癖这一事实?

您不必使用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相当轻量级,可以由复制构造函数复制。

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

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

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

一般来说,如果给予选择,

Particle myParticle[100];

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

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

需要注意的是,虽然这是好事,限制使用的new尽可能地,存在的目的, new是因为它需要对某些情况下它更适合于期望的行为。 所以它更像是一门马匹。

Particle myParticles[ 100 ];

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

所以,真正的问题是你无法将参数传递给数组中的构造函数。

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

我们需要更多信息。 可能是粒子很大,但我们想要对数组进行排序。 有一个指针数组,你可以交换它,这可能比交换粒子快很多。 粒子交换的实现可能远非微不足道。 最后你可以传递调用其他函数的数组,并复制这些指针......这很复杂。

作为一名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的扩展但是对我有用。

Particle *myParticles[ 100 ];

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

Particle myParticles[ 100 ];

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM