【发布时间】:2016-12-01 05:56:10
【问题描述】:
考虑这样的代码:
std::vector<int> vec { 1, 2, 3 };
auto addr = &*vec.end();
或简化:
int* ptr = 0;
auto addr = &*ptr;
很明显auto val = *ptr; 会出现段错误。因此&*ptr 没有以相同的方式访问内存。为什么会这样?标准中有具体的条目吗?
【问题讨论】:
-
"很明显
auto val = *ptr;会出现段错误。" - 它是?你会希望它会出现段错误,因为这样会更容易发现你的代码有缺陷,但是调用 undefined behavior (这发生在你应用对容器结束迭代器的取消引用运算符)不能保证它会出现段错误,具有“工作”的所有外观或其他任何东西。行为是未定义;除了行为的定义,你不能排除任何事情。