This question already has answers here:
Two different values at the same memory address

(7 个回答)


3年前关闭。




我知道使用 const_cast 通常是个坏主意,但我在玩它时遇到了一个奇怪的行为,其中:

两个指针具有相同的地址值,但在取消引用时,给出不同的数据值。

有没有人对此有解释?

代码
#include <iostream>

int main()
{
    const int M = 10;

    int* MPtr = const_cast<int*>(&M);

    (*MPtr)++;

    std::cout << "MPtr = " << MPtr << "   (*MPtr) = " << (*MPtr) << std::endl;
    std::cout << "  &M = " << &M << "         M = " << M << std::endl;
}

输出
MPtr = 0x7fff9b4b6ce0   (*MPtr) = 11
  &M = 0x7fff9b4b6ce0         M = 10

最佳答案

因此,除了“它是未定义的行为”(它是)之外,编译器完全可以使用 M 是一个常量的事实,因此在 cout ... << M << ... 的评估中不会改变,因此可以使用具有立即数 10,而不是存储在 M 内存中的实际值。 (当然,标准不会说这是如何工作的,更多的是“未定义”,并且编译器能够在不同的情况下选择不同的解决方案等等,所以如果你修改,你完全有可能得到不同的结果代码,使用不同的编译器,不同版本的编译器或风向不同的方向吹)。

“未定义行为”的部分棘手之处在于它包括“完全符合您的预期”以及“几乎符合您的预期”的事物。如果编译器发现这是您正在做的事情,它也可以决定启动俄罗斯方块。

是的,这就是您不应该使用 const_cast 的原因之一。至少不是在最初是 const 的东西上 - 如果你有这样的东西就可以了:

int x;

void func(const int* p)
{
  ...
  int *q = const_cast<int *>(p);

  *q = 7;
}


...

 func(&x);

在这种情况下, x 实际上不是 const,当我们将它传递给 func 时,它​​只是变成了 const。当然,编译器可能仍然假设 xfunc 中没有改变,因此你可能会遇到问题......

关于c++ - const_cast 的奇怪行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22391423/

10-11 22:10
查看更多