为什么 vector.reserve(2) 后跟 v[0] = 2 被认为是不正确的
Why is vector.reserve(2) followed by v[0] = 2 considered incorrect?
所以据我所知,reserve 不会初始化抽象,而只是分配空间以包含它们。但是,v[0] 不应该总是给你第一个单元化内存,并且不应该给它分配一个值总是有效的吗?
因为reserve
不会改变向量的大小。它仅将矢量移动到内存中有足够的空间以允许在必要时增加矢量大小的位置。
如果你想确定你可以调用v[0]=2
,甚至v[1]=0
,你应该使用resize(2)
,而不是reserve(2)
。
因为它调用未定义的行为。 库编写器可以合法地将 begin() 的地址保留为 nullptr,直到您调整大小。 或者将其设置为 0xBAADFOOD。 或者在写入硬盘时格式化硬盘。
现在,更有可能发生的是这是未初始化的内存。 所以没有什么可怕的事情发生,除了调试中的一堆断言,以及向量关于它的状态而没有办法修复它的事实。
相关文章:
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 为什么要 boost::p roperty_tree::write_json() 将整数值转换为字符串?这是不正确的
- 我的程序中的值计算不正确,即使支持数学是正确的
- C++:读取字符是不正确的
- rpmbuild check-rpath 报告错误,指出路径不是绝对的,不正确的
- "this" Lambda 捕获的是不正确的。海湾合作委员会编译器错误?
- 不正确的演员 - 是铸件还是不确定行为的使用
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- C++:我的简单计算器程序无法打印出来。我也认为我的变量命名不正确
- 为什么这个嵌套的 lambda 不被认为是 constexpr?
- 我在变量上收到 3 个 C4703 错误,我认为我已经正确初始化了,但我不确定我错过了什么
- 快速傅里叶变换:第一个元素是正确的,但其余元素不正确
- 下面的代码是格式不正确的 NDR 还是格式正确的代码
- 为什么第一个原型是正确的,而第二个原型是不正确的
- 为什么 vector.reserve(2) 后跟 v[0] = 2 被认为是不正确的
- c++:"pointer to const"指向的对象是否被认为是不变的还是不可修改的?
- 将 const 传递给接受 const 指针的函数是不正确的
- 后缀否定是不正确的,而且是交流性的
- 像这样在作用域外使用delete是不正确的吗