CStringArray / list - Heap
-
Hi,
Wenn ich ein CStringArray auf dem Heap installiere, muss ich dann auch gleich die Größe des Arrays festlegen, oder kann ich problemlos dieses Array im nachhinein vergrößern?
//was gibt diese [1] hier genau an? CStringArray* pstrArry = new CStringArray [1]; pstrArry->Add(_T("Teststring1\n")); pstrArry->Add(_T("Teststring2\n")); pstrArry->Add(_T("Teststring3\n")); pstrArry->Add(_T("Teststring4\n")); pstrArry->Add(_T("Teststring5\n")); delete[] pstrArry;
Mfg
Franz
-
CStringArray kümmert sich für Dich um den Speicher, daher kannst Du (relativ) bedenkenlos Add() verwenden.
Aus dem selben Grund musst Du CStringArray auch nicht mit
new
auf dem Heap erzeugen.Und wenn doch, dann nicht
delete[]
verwenden, sonderndelete
, da du nur ein CStringArray-Objekt erzeugst und nicht mehrere!//was gibt diese [1] hier genau an? // ANTWORT: Du legst ein (C-)Array von CSTringArray-Objekten auf dem Heap an mit einem Element CStringArray* pstrArry = new CStringArray [1]; //Das hier willst Du: CStringArray myStrings; myStrings.Add(L"Hallo "); myStrings.Add(L"Welt!"); // oder: myStrings.SetSize(2); //besser, wenn Du weißt wie viele CStrings du brauchst myStrings[0] = L"Hallo "; myStrings[1] = L"Welt!"; CString halloWeltString = myStrings[0] + myStrings[1];
-
danke für die Erklärung: [1] gibt also die Anzahl der CStringArrays an und nicht die Anzahl der Items innerhalb eines Arrays.
In meinem Fall muss ich es mit new intialisieren und mit delete wieder löschen, da beides in unterschiedlichen Funktionen statt finden muss.
Eine Frage hab ich noch zu CStrings: gibt es auch eine Möglichkeit diese als const innerhalb eines Headerfiles zu deklariern?
static const CString MY_STRING_DEFINE _T("0");
Dies funktioniert nicht; aber vielleicht gibt es ja eine working solution
-
Franz Holbert schrieb:
In meinem Fall muss ich es mit new intialisieren und mit delete wieder löschen, da beides in unterschiedlichen Funktionen statt finden muss.
Wenn sich die Besitzverhältnisse ändern, dann verwende Smart-Pointer dafür. Schau Dir mal den std::tr1::shared_ptr an. Wenn Du kein Compiler mit TR1-Unterstützung hast, dann gibt es das auch bei boost. Diese Smart-Pointer sorgen dafür, dass das Objekt in jedem Fall (auch bei Exceptions etc.) wieder richtig freigegeben wird und Du ersparst Dir das händische delete.
Siehe hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-134971.html
Franz Holbert schrieb:
static const CString MY_STRING_DEFINE _T("0");
Dies funktioniert nicht; aber vielleicht gibt es ja eine working solution
static const CString MY_STRING_DEFINE = L"ABC";
Aber schau mal hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-268522.html
-
Roger Wilco schrieb:
static const CString MY_STRING_DEFINE = L"ABC";
Aber schau mal hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-268522.html
Vielen Dank für diesen echt hilfreichen Link; sollte sich in der FAQ befinden, wenn das noch nicht der Fall ist
Beantwortet alle Fragen.
Danke
Franz