-Error lecture des caractères de la chaîne

J’ai le bloc de code suivant:

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); } 

Les informations de Visual Studio Debugger sont ici:

entrez la description de l'image ici

Pourquoi le programme ne peut-il pas lire les caractères d’une chaîne?

Un test m’a montré que cela fonctionne de la manière suivante:

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

getCarName renvoie probablement un temporaire. Après l’affectation, l’object temporaire est détruit et le pointeur item.pszText pointe vers une mémoire non valide. Vous devez vous assurer que l’object chaîne est valide lors de l’appel à ListView_InsertItem .

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

const_cast est un artefact du fait que l’API Windows utilise la même structure pour définir et extraire des informations. Lors de l’appel de ListView_InsertItem la structure est immuable, mais il n’y a aucun moyen de le refléter dans le langage.

On dirait que vous essayez d’utiliser la valeur d’une “chaîne” C ++ dans un appel C / Win32.

stdssortingng.c_str () est la bonne façon de le faire.

… MAIS …

Vous devez strcpy () la chaîne d’une variable temp, puis appelez Win32 avec la variable temp.