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 Zeilen

    String^ 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!


Anmelden zum Antworten