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

how to create array of objects without dynamic memory allocation

本文关键字:分配 情况下 创建对象 数组 内存 动态      更新时间:2023-10-16

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

我的问题是,

  • 为什么我需要在这里使用new,因为我事先就知道我需要多少内存
  • 有没有一个代码和我的示例代码一样,没有动态内存分配?(并且不使用诸如vector之类的std容器((…class+dynamic mometry组合在一起越来越令人困惑(

示例代码:

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++语言的一个怪癖??

您不必使用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**,而不仅仅是Particle*,这就是为什么需要分配内存。

Particle myParticles[ 100 ];

确实会创建一个Particle数组,并且不需要分配mem。

相关文章: