-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 に答える