gpt4 book ai didi

c++ - const 对象和成员指针的 const 正确性,构造函数漏洞

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:15 26 4
gpt4 key购买 nike

class Test
{
public:
Test() : i(0), ptr(&i) {}
int i;
int *ptr;
void change_const (int x) const { *ptr=x; }
};

int main()
{
const Test obj;
obj.ptr = &obj.i; // error
obj.change_const(99);
return 0;
}

虽然在objptrint *const类型,构造函数可以让他指向i类型为 const int。明确尝试这样做当然会失败。为什么构造函数会提供有关 const 正确性的漏洞?其他非直接明显的漏洞,如

int *ptr;
const int **c_ptr = &ptr; // error
const int c = 10;
*c_ptr = &c;
*ptr = 20; // because here change of c possible

也经过深思熟虑。

最佳答案

const是语言层面的概念。也就是说,当您编译代码并将其作为机器代码执行时,所有数据或多或少都被视为数据。请注意,我说“或多或少”是因为我们忽略了一个事实,即理论上,const数据可以存储在只读页面中,并在写入时触发页面错误;但由于页面大小的粒度,这并不常见。所以发生的事情如下:

您的构造函数初始化 ptr 的值指向i的地址.由于您的 obj对象是 const , 你不能直接修改 i 的值此外,您无法更改 ptr 的位置指着。但是,您可以访问和操作 ptr 的内存。指向(在本例中为 i 的值)。

因此,由于编译器不检查/知道/关心 ptr指向 i , 它没有发现 const 的违规行为.相反,它只是看到您修改了 ptr 指向的数据。 .

关于c++ - const 对象和成员指针的 const 正确性,构造函数漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21082581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com