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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top