使用内存位置无法更改const值

时间:2014-05-30 07:00:03

标签: c++ memory-management const

我正在围绕c ++内存分配进行一些测试。

在下面的代码示例中,我想使用内存位置更改const变量(= cannotBeChangedDirectly)的值。

为什么不起作用?

当我看一下我能看到的内存时,地址的值(两个变量,const和正常变量都会改变,但是当我打印结果时,const变量仍然具有旧结果,为什么?)

请考虑以下代码示例:

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    const int       cannotBeChangedDirectly = 10;
    std::cout << "cannotBeChangedDirectly &" << &cannotBeChangedDirectly << " cannotBeChangedDirectly =" << cannotBeChangedDirectly << std::endl;
    int* canBeChanged = const_cast<int*>(&cannotBeChangedDirectly);

    std::cout << "cannotBeChangedDirectly &" << &cannotBeChangedDirectly << " canBeChanged & " << canBeChanged << std::endl;
    std::cout << "cannotBeChangedDirectly =" << cannotBeChangedDirectly << " canBeChanged = " << *canBeChanged << std::endl;

    *canBeChanged = 19;

    std::cout << "cannotBeChangedDirectly &" << &cannotBeChangedDirectly << " canBeChanged & " << canBeChanged << std::endl;
    std::cout << "cannotBeChangedDirectly =" << cannotBeChangedDirectly << " canBeChanged = " << *canBeChanged << std::endl;
}

3 个答案:

答案 0 :(得分:3)

更改const是未定义的行为,因为:
const不仅是编译器不允许你直接更改变量, 但它允许进一步的编译器优化,比如根本不分配任何变量 并在任何地方插入值

答案 1 :(得分:2)

cannotBeChangedDirectlyconst不仅意味着你不能直接修改它,它意味着无论如何都要修改它是未定义的行为,包括通过指针修改它。

答案 2 :(得分:2)

const_cast仅适用于首先不是const的内存。

void example(const std::string* s)
{
  std::string* edits = const_cast<std::string*>(s);
  *edits="bar";
}

std::string a;
const std::string b;

int main(){
   example(&a); //ok
   example(&b); //undefined behavior.
}