2

私はコードを書いていますが、そのかなりの部分で wchar 配列を返す必要があります。wstringを返すことは実際にはオプションではありません(使用できますが)。ポインターを引数として渡して入力できることはわかっていますが、特にこのワイド文字の配列へのポインターを返すことを検討しています。最初の数回の繰り返しで、配列を問題なく返すことがわかりましたが、それらが処理されて印刷されるまでに、メモリが上書きされ、意味不明なままになります。これを修正するために、すべてを修正した wcsdup の使用を開始しましたが、何が起こっているのかを正確に把握するのに苦労しています。現状では、文字列を返すたびに wcsdup を使用し、文字列が返されるたびに、メモリ リークが発生することがわかっています。これが私がやっていることです。

wchar_t *intToWChar(int toConvert, int base)
{
    wchar_t converted[12];
    /* Conversion happens... */
    return converted;
}

wchar_t *intToHexWChar(int toConvert)
{
    /* Largest int is 8 hex digits, plus "0x", plus /0 is 11 characters. */
    wchar_t converted[11];

    /* Prefix with "0x" for hex string. */
    converted[0] = L'0';
    converted[1] = L'x';

    /* Populate the rest of converted with the number in hex. */
    wchar_t *hexString = intToWChar(toConvert, 16);
    wcscpy((converted + 2), hexString);

    return converted;
}

int main()
{
    wchar_t *hexConversion = intToHexWChar(12345);
    /* Other code. */

    /* Without wcsdup calls, this spits out gibberish. */
    wcout << "12345 in Hex is " << hexConversion << endl;
}
4

2 に答える 2

0
wchar_t *intToWChar(int toConvert, int base)
{
    wchar_t converted[12];
    /* Conversion happens... */
    return converted;
}

これは、ローカル変数へのポインターを返します。

wchar_t *hexString = intToWChar(toConvert, 16);

この行の後、hexString無効なメモリを指し、その使用は未定義です (まだ値があるか、ガベージである可能性があります!)。

からの戻り値でも同じことを行いintToHexWCharます。

ソリューション:

  • 使用するstd::wstring
  • 使用するstd::vector<wchar_t>
  • 使用する関数に配列を渡します
  • スマート ポインターを使用する
  • 動的メモリ割り当てを使用します (使用しないでください!)

wcout注:代わりにに変更する必要がある場合もありますcout

于 2015-08-28T13:06:02.903 に答える
0

質問に「C++」のタグを付けたので、答えは圧倒的です。いいえ、まったく使用wcsdupしないでください。wchar_t代わりに、値の配列を渡すには、 を使用しますstd::vector<wchar_t>

必要に応じて、最初の要素のアドレスを取得することで、それらを に変換できますwchar_t*(ベクトルは連続したメモリに格納されることが保証されているため)。

cout << "12345 in Hex is " << &hexConversion[0] << endl;
于 2015-08-28T12:56:19.557 に答える