Kurze frage zu gcnew
-
Hallo,
ich fange gerade an mich mit C++/CLI zu beschäftigen und habe eine Frage:
Ich wollte ein altes Projekt von mir in C++/CLI einbauen. Daher vermischen sich std::string und System::String^ ein wenig. Eine Funktion von mir könnte zB so aussehen:String^ bearbeite(const std::string& eins, const std::string& zwei) { String^ tmp = gcnew String(eins.c_str()); tmp = gcnew String(zwei.c_str()); return tmp; }
Meine Frage ist nun, ob ich mit dieser Funktion ein Memory Leak produziere. Also gehört zu jedem gcnew ein entsprechendes delete (wie bei new/delete) ?
mfg
-
std::string ist hoffentlich so programmiert, dass es keine Leaks hat.
Das ergibt absolut keine Probleme. Der Sinn hiner den ZeilenString^ tmp = gcnew String(eins.c_str()); tmp = gcnew String(zwei.c_str()); return tmp;
entgeht mir jedoch. Die Funktion gibt einfach nur den 2. String als .NET-String zurück. Was macht der erste String? Wozu das ganze?
-
Jaja, ist nen blödes Beispiel. Hätte ja sein können, dass EIN gcnew auf einen String^ vom programm gemanaged wird und das nächste dann als Leiche in meinem Speicher rumhängt
-
Das ist ja gerade der "Trick" an .NET, dass er den Speicher selber aufräumt
-
Also gehört zu jedem gcnew ein entsprechendes delete (wie bei new/delete) ?
Nein. Ausser wenn der managed Type (z.B. ref class) ein ~ClassName Konstrukt hat. In C++/CLI wird damit das IDisposable interface impl.
Du benötigst also ein delete auf ein mit gcnew erzeugtes Objekt wenn Du Dipose() aufrufen musst.
Simon
-
Soweit hab ich mich in die Materie noch nicht eingearbeitet.
Gut, dann wäre meine Frage geklärt.
Danke an Alle!