为什么运行得很好?(范围外变量的访问地址)
Why does this run fine ? (accessing address of an out-of-scope variable)
为什么运行良好?(并且连续好几次…)
double* p(nullptr);
cout << p << endl; // "00000000"
{
double d(82.);
p = &d;
}
cout << p << endl; // "0029FD98"
// Naughty, dirty, sneaky..
// .. but rather *pure* curiosity after all.. u_u
cout << *p << endl; // "82", first surprise
*p = 83.; // (getting further down the hole..)
cout << *p << endl; // "83", and I almost feel disappointed. :(
d
不应该在作用域之外,0029FD98
不应该被释放吗?为什么我的操作系统不生我的气?我只是超级幸运吗?
您正在调用未定义的行为。根据c++规范,这里可能发生任何事情。未定义行为是一件非常糟糕的事情,因为它意味着你无法知道你的程序可能会做什么。
在使用特定编译器的特定平台上,这可能有效,因为变量是在堆栈上分配的,并且在程序运行时堆栈内存(通常)不会被释放。因此,0029FD98
指的是内存分配区域内的地址(在本例中是堆栈)。一旦调用函数,这个位置很可能被该函数需要堆栈空间的任何内容覆盖。
在其他系统和/或编译器上,局部变量和/或堆栈的行为或实现可能不同,这可能输出一些随机数,或者它可能崩溃,或者它可能输出莎士比亚的集体作品。
相关文章:
- 从不同C++类的成员变量访问成员函数
- 在主函数中C++私有变量访问
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- C++中的变量访问内联函数
- 无法使用子类变量访问超类公共成员
- 优化成员变量访问
- Ifstream:打开可使用变量访问的文件
- 使用'this->'成员变量访问的性能
- 从成员变量访问静态 constexpr 成员,GCC 错误?
- TLS变量访问的结果未缓存
- 通过const成员变量访问内联函数
- 获取通过环境变量访问的文件的位置
- 静态变量访问
- 从函数变量访问结构变量的成员
- 从另一个变量访问变量
- 使用变量访问结构中的任何数据
- 如何使用另一个变量访问对象的变量/方法
- 使用用户变量访问结构的成员?C++
- 我需要通过基类静态变量访问派生类成员
- 如何将一个文件中存在的全局常量变量访问到另一个文件