const char*タイプのデータの強制変更

1339 ワード

C++はタイプセキュリティ(type-safe)のプログラミング言語であり、タイプの検査に非常に厳しい.const char*タイプのデータは変更できません.プログラムがこの規定に違反した場合、コンパイラは間違いを容赦なく提示し、通過させません.プログラマーとして、このような制限は実用的な意味があることを知っておく必要があります.結局、多くの場合、タイプの安全なコードが必要です.しかし、時にはconst char*タイプのデータを本当に修正する必要があります.どうすればいいですか?大丈夫です.C++もかなり柔軟なプログラミング言語で、const_を提供しています.cast<>はこのようなニーズを専門に処理している.
例を挙げる.次のコードを見てください.
char szArray[]="Constring";
const char* str1=szArray;
str1[0]='c';  //#1 Error
char* str=const_cast(str1);
str[0]='c';   //#2 OK

#1でエラーが発生し、コンパイルが通過できません.const_を使用するとcast<>str 1が指すメモリの定数性を除去した後、その内容を変更することは許可されます.const char*タイプのデータを強制的に変更する方法は、const_を使用することです.cast<>文字列の定数を除去し、変更できるようにします.
しかし、次のコードを見てください.
const char* str1="Constring";
char* str=const_cast(str1);
str[0]='c';    //#3 Runtime Error

コンパイラは間違いを報告していません.上のコードには文法の問題がないからです.しかし、プログラムはいったん走り出すと3箇所にaccess violation異常が投げ出され、実行時エラーが発生する.理由は簡単で、「Constraing」は定数データ領域に格納されており、変更できません.この強制性は、文法的な制約ではなく、メモリセキュリティの意味的な制約です.
まとめてみると、全部で3つあります.
(1)const char*タイプのデータは文法的に修正できないので、プログラマーは多くの場合本当に「規則に従うべきだ」.
(2)確かに修正が必要な場合のみconst_を使用するcast<>転換操作はconstデータの定数性を抹消し、さらにデータを修正し、動作は「乱暴」であるが実行可能である.
(3)定数データ領域のデータのconst属性は相談できません.const_を使ってもcast<>はコンパイラをだまし、プログラムが走り出すと必ず異常が発生します.