【发布时间】:2020-10-01 00:55:13
【问题描述】:
如果我有一个像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 添加新元素时,我们是否在数组边界之外写入?
【问题讨论】:
-
向量不会将分配的内存存储在向量对象内。一个向量包含一个大小的 int 和一个指向一些堆分配内存的指针,也许还有其他一些东西。所以向量数组很好,因为当向量增长时,它是被重新分配的堆内存,而这些都不是在向量对象内部(因此不在数组内部)。
-
@JerryJeremiah 哦,是的,这实际上是有道理的。所以我们实际上是在创建一个指针数组。谢谢!