首页 > 解决方案 > 允许动态分配的 C 对象数组

问题描述

如果我有一个动态分配的类,比如std::vector. 用该对象的元素创建一个数组有多大意义?

我测试了以下内容:

std::vector<int> array[2];

array[0].push_back(10);
array[0].push_back(20);
array[0].push_back(30);


array[1].push_back(40);
array[1].push_back(50);
array[1].push_back(60);

for (auto x : array[0]) {
    std::cout << x << std::endl;
}

for (auto x : array[1]) {
    std::cout << x << std::endl;
}

哪个正确输出值。然而,这实际上是未定义的行为吗?数组元素在内存中连续定位。当一个std::vector对象在没有指定大小的情况下初始化时,它不会分配任何内存。那么当我们创建一个包含两个元素的数组时,是否分配了任何内存?然后,当我们添加新元素时,std::vector我们是否在数组边界之外写入?

标签: c++arraysvector

解决方案


这里没有未定义的行为。

用该对象的元素创建一个数组有多大意义?

这完全取决于您和您的设计考虑。拥有一个向量数组是非常好的。

那么当我们创建一个包含两个元素的数组时,是否分配了任何内存?

是的,分配了数组的内存。

然后当我们向 std::vector 添加新元素时,我们是否在数组边界之外写入?

std::vector动态分配内存。默认构造的向量可能会也可能不会分配内存。这取决于实现。在内部,向量可能只是持有指针。

一些实现可能比这更聪明,通过从没有动态分配的固定数量的元素切换到如果要求超过动态分配则使用动态分配。 std::string实现通常通过重新利用内部指针存储来保存字符串数据来做到这一点。

请注意,如果您将一些元素推送到新向量上,最好调用reserve该向量以避免在其增长时进行不必要的重新分配。


推荐阅读