codice minimo che riproduce il problema:Perché il compilatore utilizza una variabile temporanea?
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
CComBSTR ccbTest(L"foo");
const wchar_t * pTest = ccbTest ? ccbTest : L"null string";
return 0;
}
Il compilatore utilizza una temporanea CComBSTR
quando vuole memorizzare un puntatore in pTest
. Quindi utilizza la conversione BSTR
disponibile nella classe CCcomBSTR
, con il temporaneo e memorizza il puntatore in pTest
. Quindi il temporaneo viene distrutto e mi viene lasciato un puntatore pendente in pTest
.
La correzione è quello di lanciare la CComBSTR
:
const wchar_t * pTest = ccbTest ? static_cast<BSTR>(ccbTest) : L"null string";
Non capisco il motivo per cui la correzione è necessaria. Ho pensato che il compilatore avrebbe solo provato a convertire in BSTR
tutto da solo. Perché un temporaneo?
Si prega di provare il mio codice, eseguire il debug e inserire le chiamate: c'è un temporaneo, anche se non "lo vedi" :-) – manuell