2017-12-23 9 views
1

wird eine neue eines TCHAR * Array hat negative/undefined Wirkung? Oder vielleicht sogar nicht empfohlen? Der folgende Code hat bisher gut funktioniert. Brauche Eingaben. Vielen Dank!Re-'new 'TCHAR * Array

//e.g. 
TCHAR *tc1 = new TCHAR[1]; 

// later: 

//resize TCHARs 
tc1 = new TCHAR[size1]; 
tc1[size1] = { L'\0' }; 
+3

Ein solcher Code _resize_ das Array nicht, verwirft den vorherigen Zeiger auf ein Array (verursacht einen Speicherverlust) und überschreibt 'tc1' mit einem Zeiger auf ein neues Array. –

+0

Wenn Sie den zugewiesenen Speicher freigeben, sollte dies keine negativen Auswirkungen haben. – Asesh

+2

Außerdem, wenn Sie explizit '' L ''Präfix für breite Zeichen verwenden, dann sehe ich keinen Grund, TCHAR zu verwenden, stattdessen wchar_t verwenden oder _T oder TEXT Makro verwenden. Denken Sie daran, dass die Verwendung von TCHAR Ihren Code nicht portierbar macht. – Asesh

Antwort

2

Dies ist ein Speicherleck. Sie müssen delete alles von einem new Anruf erstellt werden. Wenn Sie das tun, ist alles in Ordnung:

//e.g. 
TCHAR *tc1 = new TCHAR[1]; 

// later: 

//resize TCHARs 
delete [] tc1; 
tc1 = new TCHAR[size1]; 
tc1[size1] = { L'\0' }; 

Obwohl auf einem nicht verwandten beachten Sie, Ihre letzte Zeile hinter dem Array Schreiben Sie zugeordnet. Das ist nicht gut. Aber es hat nichts mit Ihrer Speicherzuweisung zu tun, es ist ein Fehler für sich.

Eine Menge davon kann vermieden werden, wenn Sie eine String-Klasse verwenden. Entweder std::string oder wenn Sie den MFC verwenden, CString.

+0

Möchte wahrscheinlich 'std :: basic_string ' statt 'std :: string' verwenden, wenn sie' TCHAR' an erster Stelle verwenden. – user2079303

2

Der negative Effekt des "Re-Newing" ist, dass Sie den Zeiger auf den ursprünglich zugewiesenen freien Speicher verlieren. Es bleibt während des gesamten Rests Ihres Programms besetzt, ohne dass Sie es zurückerobern könnten.

Natürlich können Sie einen anderen Zeiger auf den Speicher zeigen, aber das wäre ein sehr seltsames und unnötig komplexes Stück Code.

Vermeiden Sie all diese Probleme, indem Sie std::vector anstelle von new[] verwenden.

tc1 = new TCHAR[size1]; 
tc1[size1] = { L'\0' }; 

Neben dem Speicherleck, das ist nicht definiertes Verhalten, weil size1 einer nach dem letzten gültigen Index ist.


Hier ist ein std::vector Beispiel:

std::vector<TCHAR> tc1(1); 

// later: 

//resize TCHARs 
tc1.resize(size1); 
tc1[size1 - 1] = L'\0'; 

Vielleicht sogar std::string oder std::wstring für Ihre Bedürfnisse ausreicht.

Verwandte Themen