CストリングとワイドCストリングについて少し混乱しています。この質問のために、私がMicrosoft Visual Studio2010Professionalを使用していると仮定します。私の情報が間違っている場合はお知らせください。
名前を格納するために使用されるconstwchar_t*メンバーを持つ構造体があります。
struct A
{
const wchar_t* name;
};
オブジェクト「a」に名前を付けると、次のようになります。
int main()
{
A a;
const wchar_t* w_name = L"Tom";
a.name = w_name;
return 0;
}
これは、w_nameが指すメモリアドレスをa.nameにコピーするだけです。現在、w_nameとa.nameはどちらも、メモリ内の同じアドレスを指すワイド文字ポインタです。
私が正しければ、私はこのような状況をどうしたらいいのだろうと思っています。tinyxml2を使用してXML属性からC文字列を読み込んでいます。
tinyxml2::XMLElement* pElement;
// ...
const char* name = pElement->Attribute("name");
C文字列を取得したら、次のようにワイド文字列に変換します。
size_t newsize = strlen(name) + 1;
wchar_t * wcName = new wchar_t[newsize];
size_t convertedChars = 0;
mbstowcs_s(&convertedChars, wcName, newsize, name, _TRUNCATE);
a.name = wcName;
delete[] wcName;
私がこれまでのところ正しければ、次の行があります。
a.name = wcName;
配列wcNameの最初の文字のメモリアドレスをa.nameにコピーしているだけです。ただし、このポインタを割り当てた直後にwcNameを削除しているため、ガベージを指すようになります。
C文字列をワイド文字のC文字列に変換してから、それをa.nameに割り当てるにはどうすればよいですか?