Perché non wstring :: c_str causa una perdita di memoria, se non adeguatamente cancellati
-
26-09-2019 - |
Domanda
Codice Segmento 1:
wchar_t *aString()
{
wchar_t *str = new wchar[5];
wcscpy(str, "asdf\0");
return str;
}
wchar_t *value1 = aString();
Codice Segmento 2
wstring wstr = L"a value";
wchar_t *value = wstr.c_str();
Se il valore di segmento di codice 2 non viene eliminato quindi una perdita di memoria non si verifica. Tuttavia, se value1 dal segmento di codice 1 non viene eliminato v'è una perdita di memoria. Il codice interno per wstring :: c_str sembra lo stesso per me.
Soluzione
Una regola importante:. È necessario utilizzare delete
su tutto ciò che è stato creato da new
, e non necessario eliminare nient'altro
wstr.c_str()
restituisce un puntatore a un buffer che è gestita dall'oggetto wstring
. Sarà deallocato quando la stringa viene distrutto, dopo di che il puntatore non sarà più valida. Utilizzando delete
su questo è sbagliato. Il puntatore verrà inoltre invalidata se si modifica la stringa.
aString()
restituisce un puntatore a un buffer che è stata creata usando new[]
, quindi è necessario eliminarlo quando hai finito con esso (usando delete[]
, per abbinare new[]
). Questo è soggetto a errori, è per questo che è meglio pratica utilizzare le classi di risorse di gestione (come string
, wstring
, contenitori e puntatori intelligenti) invece di passare puntatori intorno prime e sperando che siano trattati correttamente.
Altri suggerimenti
A causa c_str()
si restituisce un puntatore alla rappresentazione interna del wstring
. La classe mantiene il controllo dei dati in esso contenuti.
Preso dal basic_string::c_str()
documentazione MSDN :
La stringa di C-stile restituito non dovrebbe essere modificato, in quanto ciò potrebbe invalidare il puntatore alla stringa, o cancellato, come la stringa ha una durata limitata ed è di proprietà della stringa di classe .
ho intenzione di andare su un arto e dire che un wstring non è un wchar_t, ma invece una classe che ha un operatore per restituire un wchar_t *, quindi nel distruttore di wstring, è probabile che libera la propria copia del wchar_t * restituisce.