Arn*_*aud 5 c++ pointer-arithmetic undefined-behavior language-lawyer c++11
今天我写了一些看起来像这样的东西:
void foo(std::vector<char>&v){
v.push_back('a');
char*front=&v.front();
char*back=&v.back();
size_t n1=back-front+1;
v.push_back('b');//This could reallocate the vector elements
size_t n2=back-front+1;//Is this line valid or Undefined Behavior ?
}
Run Code Online (Sandbox Code Playgroud)
如果当我按下"b"时发生重新分配,我还可以计算出我的两个指针的差异吗?
在阅读了标准的相关段落几次之后,我仍然无法在这一点上思考.
C++ 11 5.7.6:当减去指向同一数组对象元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应与标题(18.2)中定义为std :: ptrdiff_t的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式P和Q分别指向数组对象的第i和第j个元素,则表达式(P) - (Q)具有值i-j,条件是该值适合于std :: ptrdiff_t类型的对象.此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,则表达式((Q)+1) - (P)具有与((Q) - (P))+ 1和 - ((P) - ((Q)+1))相同的值,并且如果表达式P指向一个,则值为零数组对象的最后一个元素,即使表达式(Q)+1没有指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.
当然我知道它有效,我只是想知道它是否合法.
删除对象的指针是有毒的:除了给它们一个新值之外,不要触摸它.存储器跟踪系统可以捕获对回收的指针值的使用.但是,我不知道是否存在任何此类系统.
相关引用是3.7.4.2 [basic.stc.dynamic.deallocation]第4段:
如果给标准库中的释放函数赋予的参数是一个不是空指针值的指针,则释放函数将释放指针引用的存储,使得所有指向解除分配存储的任何部分的指针无效.使用无效指针值(包括将其传递给释放函数)的效果未定义.
调整大小时,std::vector<...>它会跳过许多箍(分配器),默认情况下,最终会调用释放函数.
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |