2

LPCWSTR の動的配列を作成しており、実行時に値を割り当てたいと考えています。私は次のコードを持っています:

cin>>count
LPCWSTR * lpwcstrArray = new LPCWSTR[count]();

for (int i = 0; i < count; i++)
{
    // some logic to create different wstring on each iteration
    wstring tempWString = L"somerandomstuff";

    lpwcstrArray[i] = reinterpret_cast<LPSWSTR>tempWString.c_str();
}

ここで、lpwcstrArray にアクセスすると、すべてのインデックスが最後に割り当てられた文字列のデータを指します。

これが値を割り当てる正しい方法ではないことはわかっていますが、正しい方法はわかりません。

4

3 に答える 3

1

一時 std::wstringオブジェクトの内部を指すポインタを格納しています。これらのオブジェクトがループの反復ごとに破棄されると、配列にはポインタがぶら下がったままになります。代わりに、個々の文字列を動的に割り当てる必要があります。たとえば、次のようになります。

std::cin >> count
LPWSTR *lpwstrArray = new LPWSTR[count];

for (int i = 0; i < count; i++)
{
    // some logic to create different wstring on each iteration
    std::wstring tempWString = L"somerandomstuff";

    LPWSTR str = new WCHAR[tempWString.length()+1];
    const wchar_t *p = tempWString.c_str();
    std::copy(p, p+tempWString.length(), str);

    lpwstrArray[i] = str;
}

// use lpwstrArray as needed...

// don't forget to free the memory when you are done using it...
for (int i = 0; i < count; i++)
    delete[] lpwstrArray[i];
delete[] lpwstrArray;

実際に達成しようとしていることに応じて、少なくとも文字列への読み取り専用アクセスが必要な場合は、次のような方が安全です ( in は を表すため、配列のユーザーはおそらくそうするでしょCLPCWSTR) const。それらを変更するつもりはありません):

std::cin >> count

std::vector<std::wstring> wstrArray(count);
for (int i = 0; i < count; i++)
{
    // some logic to create different wstring on each iteration
    wstrArray[i] = L"somerandomstuff";
}

std::vector<LPWSTR> lpwstrArray(count);
for (int i = 0; i < count; i++)
    lpwstrArray[i] = const_cast<wchar_t*>(wstrArray[i].c_str());

// use lpwstrArray as needed. if you need to pass it where an
// LPWSTR* is expected, you can use &lpwstrArray[0] for that...

// lpwstrArray and wstrArray will be freed automatically
// when they go out of scope...
于 2015-07-09T23:44:18.893 に答える
-1

アプローチを試す

    std::wstring ws(_T("Hello"));
    LPCTSTR lps= (LPCTSTR)(ws.c_str());

    TRACE(lps);

ノート:

  • W 型を直接使用しないでください (例: LPCWSTR)。代わりに T タイプを使用してください (例: LPCTSTR)。なんで?それらは、プロジェクトに応じて、本来あるべきバージョン (LPCSTR非 Unicode / ASCII の場合、Unicode の場合) に自動的に変換されるためです。LPCWSTR

  • 同じ理由で、文字列を . で囲む_T()か、先頭に. を付ける必要がありますL

  • LPCTSTRから順に「Go To Definition」で深く潜ってみる

  • _tcscpy_s 関数のドキュメントも参照してください。

于 2015-07-09T23:51:04.073 に答える