如何解决C++ int 文字不在常量的内存段中?
据我所知,在程序启动期间,C++ 程序会为常量值初始化一个内存段。
例如,如果您执行 cout << "Hello World!";
,则 const char*
接收的 operator<<
参数将指向该内存段,其中字符串 "Hello World!"
所在。
我的印象是代码中的所有硬编码文字在运行时最终都驻留在该内存段中。但是,我看过一门课程,其中说明了以下陷阱:
class Data
{
public:
const int& y;
Data() : y(123) {}
void f()
{
int a[10000];
for (int i = 0; i < 10000; i++)
a[i] = 50;
}
};
void main()
{
Data d;
cout << d.y << endl;
d.f();
cout << d.y << endl;
}
陷阱被描述为在 Data
的构造函数执行期间,而不是 d.y
最终指向专用于常量值的内存段的情况,这种行为类似于 {{1 }} 是实际发生的情况,由于 int temp = 123; this->y = &temp;
在堆栈中,它会在一秒钟内消失,而在 temp
消失后,temp
可能最终会分配 {{1} f()
指向的地址最终包含在 a
中,因此在调用 y
时可能会被覆盖。
我想澄清一下:
-
真的会发生/会发生什么吗?
-
如果 1. 的答案是“是”,那么为什么会发生这种情况?某处有没有 UB 或类似的东西?
-
如果 1. 的答案是“是”,那么为什么没有修复?固定是指类似于我上面描述的解决方案,其中所有文字都驻留在它们自己的特殊内存段中?
-
还有什么我应该知道的才能更好地理解这种情况吗? (也许我没有问正确的问题?)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。