如何在没有动态内存分配的情况下创建对象数组
how to create array of objects without dynamic memory allocation
我得到了以下代码,其中在一个循环中创建了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。
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 使用指针在存在特征库的情况下动态分配 c++ 中的矩阵
- 如何在不知道对应关系的情况下在字符串中搜索字符并将其分配给另一个字符?
- 为什么它在不分配内存的情况下工作正常
- 如何在不使用 "new" 关键字的情况下解除分配创建的对象的内存?
- 在不释放所有动态分配的资源的情况下结束程序是否有风险
- 在不工作的情况下为数组分配指针,但反过来也可以
- 在这种情况下,数组a会被取消分配吗
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- 在不放置新运算符的情况下,在预分配的内存上使用虚函数初始化对象 - 这可能吗?如果没有,为什么
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- 是否可以在不分配内存或复制数据的情况下构造对象?
- 有没有办法在不覆盖实际分配的情况下使用 vulkan 内部分配回调?
- 在以下情况下,是否可以分配未对齐的对象?
- 为什么在这种情况下不调用我的移动构造函数?(首先分配 r 值引用并创建对象)
- 我可以在不手动将它们分配在堆上的情况下存储iostreams集合
- C++没有等号,而是在不分配值的情况下进行编译
- 在哪些情况下,从 std::forward 分配比从 std::move 分配更可取?为什么
- 如何在不违反 const 限制的情况下动态分配模板类中的空间