不能使用内存位置更改Const值
const value cannot be changed using memory location
我正在做一些关于c++内存分配的测试。
在下面的代码示例中,我想使用内存位置更改const变量(= cannotbechangeddirect)的值。
为什么不工作?
当我查看内存时,我可以看到地址的值(两个变量,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;
}
改变const ' s是未定义的行为,因为:const
不仅是编译器不允许你直接修改变量,
但是它允许进一步的编译器优化,比如根本不分配变量
然后在各处插入值
cannotBeChangedDirectly
is const
不仅意味着你不能直接修改它,还意味着以任何方式修改它都是未定义的行为,包括通过指针修改它
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.
}