C++:如何在堆栈上创建对象数组?

Leo*_*nel 5 c++ arrays oop stack

考虑以下Java代码.

int N = 10;
Object obj[] = new Object[N];
for (int i = 0; i < N; i++) {
    int capacity = 1000 * i;
    obj[i] = new ArrayList(capacity);
}
Run Code Online (Sandbox Code Playgroud)

因为在Java中,所有对象都存在于Heap中,所以数组不包含对象本身,而是包含对象的引用.此外,数组本身也是一个对象,因此它存在于堆上.

什么是C++中的等价物,但保持堆栈中的数组和对象,以尽可能避免需要new和delete?

编辑:更改代码以使用自定义构造函数.

Jor*_*ans 5

简单地宣布

Object array_of_objects[10];
Run Code Online (Sandbox Code Playgroud)

在C++中,在堆栈上创建10个类型为Object的默认构造对象.

如果你想使用非默认的构造函数,那么在C++中就不那么容易了.可能有一种新的放置方式,但我不能告诉你我的头脑.

编辑:链接到StackOverflow上的其他问题 如何使用新的数组位置在StackOverflow的这个问题的答案中解释.


Ste*_*sop 3

对于 ArrayList 对象数组:

ArrayList obj[10];
Run Code Online (Sandbox Code Playgroud)

这些对象将被默认初始化,这对于用户定义的类型来说很好,但对于内置类型可能不是您想要的。

还请考虑:

std::vector<ArrayList> obj(10, ArrayList());
Run Code Online (Sandbox Code Playgroud)

这通过复制作为第二个参数传递的任何内容来初始化对象。所以它们都是一样的,但不一定是默认的。正如 litb 指出的,向量中的“10”可以用非常量表达式替换,而数组声明中的“10”则不能。

这实际上并没有将 ArrayList 对象放入堆栈中,而是将所有 10 个对象放入堆中的单个分配中。因此,如果您确实无力承担单个分配的费用,则可能很少会出现性能问题。但是, std::vector 位于堆栈上,并且在销毁时会删除它使用的任何堆对象。因此,为了确保释放资源,向量的行为“就好像”它们都在堆栈上一样。

请注意,将 Object 容器与 ArrayList 值混合(如在示例 Java 代码中所做的那样)在 C++ 中充满危险。基本上你无法做到这一点,即使ArrayList扩展了Object,因为数组只能包含10个对象的存储,并且ArrayList可能需要比Object更多的字节来存储。结果是,您尝试复制到数组中的任何 ArrayList 都会被“切片”:只有其表示的初始部分被放入数组中。

如果您想要一个声称包含对象但实际上包含 ArrayList 的类型的容器,那么您需要一个指针容器。为了获得良好的资源处理,这可能意味着您需要一个智能指针的容器。

  • 是的,这就是为什么我将向量作为考虑的替代方案,而不是作为问题的直接答案。毕竟,这不是测验,因此提供与问题实际所说类似的方法通常很有用,希望它能满足真正的要求。 (3认同)