Durante la migrazione di un'applicazione da VisualStudio 2005 a VisualStudio 2015 abbiamo rilevato un comportamento diverso in alcuni codici che concatenano le istanze CString quando tale codice viene creato con VS2015.
Quindi, ho creato una semplice applicazione console Win32 per dimostrare il problema.Comportamento diverso tra gli operatori CString "+ =" e "+"
L'applicazione console (utilizzando MFC come dll condiviso e set v'importa Unicode) esegue questa semplice funzione:
void f()
{
CString x('\0');
CString r('a');
r += x;
CString rr('a');
rr = rr + x;
int rSize = r.GetLength();
int rrSize = rr.GetLength();
assert(rSize == rrSize); // This assert fires when compiled and run
// under Visual Studio 2015!
}
Essa mostra che, quando un CString contenente un carattere '\ 0' è concatenato ad un'altra istanza CString , usare '+ =' o usare '+' porta a risultati diversi!
Quando viene utilizzato '+ =', la dimensione del risultato viene calcolata contando tutti i caratteri fino al primo '\ 0' ... quindi la dimensione finale è 1!
Viceversa, quando si utilizza l'operatore '+', la dimensione CString del risultato è 2, ovvero la somma delle dimensioni delle istanze concatenate!
In VisualStudio 2005 la dimensione del risultato è sempre la somma delle dimensioni delle istanze concatenate!
I filed a bug a Microsoft poche settimane fa, ma fino ad ora non ho risposta da quei ragazzi.
Le mie domande:
1. Qualcuno si è imbattuto in questo bug nella libreria MCF ??
2. Come hai lavorato a questo bug? Stiamo pensando di vietare l'uso dell'operatore + = o di sostituire la classe CString con una classe personalizzata, ma tutto ciò mi sembra "un po '" invasivo.
Solo FYI - lo stesso risultato su Visual Studio 2013. –
Per curiosità, cosa succede quando si aggiunge a 'x' prima di aggiungere' x' alle altre stringhe? Mi piace 'x + =" Ciao, Mondo! ";'? –
Il metodo 'Append()' di CString (usato nell'operatore '+ =') ha questo * strano * commento: '// Assicurarsi che non leggiamo la fine del terminazione di NULL', seguita da' nLength = StringLengthN (pszSrc , nLunghezza); '. Questo ** NON ** lascerà zero nel CString! –