1. ホーム
  2. c++

[解決済み] -文字列の読み取りエラー

2022-01-31 12:06:30

質問

次のようなコードのブロックがあります。

for( CarsPool::CarRecord &record : recs->GetRecords())
{
  LVITEM item;
  item.mask = LVIF_TEXT;
  item.cchTextMax = 6;

  item.iSubItem = 0;
  item.pszText = (LPSTR)(record.getCarName().c_str()); //breakpoint on this line.
  item.iItem = 0;
  ListView_InsertItem(CarsListView, &item);

  item.iSubItem = 1; 
  item.pszText = TEXT("Available");
  ListView_SetItem(CarsListView, &item);

  item.iSubItem = 2;
  item.pszText = (LPSTR)CarsPool::EncodeCarType(record.getCarType());
  ListView_SetItem(CarsListView, &item);
}

Visual Studio Debuggerからの情報はこちらです。

なぜプログラムは文字列から文字を読み取ることができないのでしょうか?

テストの結果、このように動作することがわかりました。

MessageBox(hWnd, (LPSTR)(record.getCarName().c_str()), "Test", MB_OK);

解決方法は?

getCarName はテンポラリを返す可能性が高い。代入後、テンポラリオブジェクトは破棄され、ポインタ item.pszText は無効なメモリを指しています。を呼び出す際に、文字列オブジェクトが有効であることを確認する必要があります。 ListView_InsertItem .

std::string text(record.getCarName());
item.iSubItem = 0;
item.pszText = const_cast<LPSTR>(text.c_str());
item.iItem = 0;
ListView_InsertItem(CarsListView, &item);

const_cast は、Windows APIが情報の設定と取得に同じ構造を使用していることに起因するものです。を呼び出すと ListView_InsertItem の場合、構造は不変ですが、それを言語に反映させる方法はありません。