【发布时间】:2015-02-19 07:35:53
【问题描述】:
我很好奇这种事情是否合法:
std::vector<some_class_type> vec;
vec.reserve(10);
some_class_type* ptr = vec.data() + 3; // that object doesn't exist yet
请注意,我并没有尝试访问指向的值。
这是标准对data() 的表述,但我不确定它是否相关:
返回:一个指针使得
[data(),data() + size())是一个有效的 范围。对于非空向量,data() == &front()。
【问题讨论】:
-
我会说指针的初始化本身是合法的。取消引用它是 UB。
-
据我所知,您对
reserve所做的工作类似于malloc,其中分配了内存但未初始化。老实说,我对标准并不完全熟悉,但从逻辑上讲,如果这不合法,那么malloc也不合法。 -
我想这完全取决于数组内存是否必须在调用
reserve时分配,或者是否可以推迟到第一次访问。如果标准中没有明确的要求,我想某些实现可能会将分配推迟到 UB 可能最少。不确定对data的调用是否会被视为“首先评估”或是否足以调用分配。 -
@Nard:为了完整起见,也在这里回复——
reserve和malloc之间的区别在于未来的调整大小操作(例如,由过去的向量增长触发它的容量)将导致数据被重新分配,可能使ptr指向的内存区域无效。 -
@EyasSH 换句话说,
reserve不一定调用malloc或realloc,而是由标准简单地定义为通知向量计划更改的函数size 所以它的实际作用是依赖于实现的,对吗?因此,将reserve视为malloc的谬误在于,在调用reserve时可能不会分配内存,因此我想OP 所做的绝对是未定义的行为?
标签: c++ pointers vector language-lawyer undefined-behavior