c++ - 允许动态分配的 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
我们是否在数组边界之外写入?
解决方案
这里没有未定义的行为。
用该对象的元素创建一个数组有多大意义?
这完全取决于您和您的设计考虑。拥有一个向量数组是非常好的。
那么当我们创建一个包含两个元素的数组时,是否分配了任何内存?
是的,分配了数组的内存。
然后当我们向 std::vector 添加新元素时,我们是否在数组边界之外写入?
std::vector
动态分配内存。默认构造的向量可能会也可能不会分配内存。这取决于实现。在内部,向量可能只是持有指针。
一些实现可能比这更聪明,通过从没有动态分配的固定数量的元素切换到如果要求超过动态分配则使用动态分配。 std::string
实现通常通过重新利用内部指针存储来保存字符串数据来做到这一点。
请注意,如果您将一些元素推送到新向量上,最好调用reserve
该向量以避免在其增长时进行不必要的重新分配。
推荐阅读
- database - 有没有办法在数据库中每秒保存 200 兆字节
- node.js - 无法在谷歌云功能工作区上写入文件
- android - AAPT:错误:意外元素
在发现 升级到安卓3.1后 - c# - 我在为包含 DBset 的班级之一编写测试时遇到问题
- functional-programming - 函数式编程:声明式 vs 命令式
- flutter - 如何在 Flutter 中制作自定义圆圈
- react-native - React Native Flat List 自定义 Sticky Header Indices ,它只有 0 索引我必须设置 1,2 索引
- android - AVD Pixel_3_API_30 的模拟器进程已针对 windows 终止
- precision - 如何在cobol中的零位置创建空格
- html - HTML CSS:如何通过响应来防止图像失真?