-1

我编写了一个小方法,可以让我轻松覆盖静态常量变量的值。

这是我要更改的变量:

static const unsigned int myInt;

这是我尝试使用的方法:

template<typename T>
void MyClass::SetConstantVariableValue(void* destination, T& value)
{
    memcpy(destination, (const void*)&value, sizeof(value));
}

这是用于调用该方法的语句:

int a = 5;
this->SetConstantVariableValue((void*)&myInt, a);

我的问题是,如果myInt只是静态而不是恒定的,它就可以完美地工作。一旦我将其定义为常量,memcpy就会因访问冲突而崩溃。

Unhandled exception at 0x596EEB90 (msvcr110d.dll)
0xC0000005: Access violation writing location 0x00AC16B8.

据我了解,memcpy忽略了一个变量可能是常量的事实,因为它是在运行时执行的,并且不知道目标或源的数据类型是什么。如果这是正确的,那么staticconst的组合就是导致崩溃的原因。我无法找到任何解释为什么这可能导致memcpy崩溃。有人知道我在做什么错吗?

4

1 回答 1

1

任何修改声明为 const 的变量的尝试都是未定义的行为。在这种情况下,编译器选择将 const 变量存储在只读存储器中。

于 2013-08-26T01:33:51.090 回答