vector anstelle von new und delete benutzen



  • Hallo,
    ich lese immer wieder in verschiedenen Beiträgen, dass es besser ist, anstelle von new und delete lieber einen container wie vector zu benutzen. Leider habe ich bisher nicht so richtige Beispiele gefunden und komme auch nicht so richtig auf eine Idee wie man folgendes mit einen vector lösen könnte:

    Klasse* erstelle_zeiger() { return new Klasse; }
    

    Dazu gibt es natürlich auch noch eine Zeiger-löschen Funktion. Wäre natürlich schön, wenn man in dem Block, in dem man sich den Zeiger erstellen lässt, ihn am Blockende nicht wieder händisch löschen muss.
    Wie löst man soetwas mit vector? Vielleicht könnt ihr bitte mal ein paar Beispiele geben, so mit new - besser mit vector?



  • fragender12 schrieb:

    Hallo,
    ich lese immer wieder in verschiedenen Beiträgen, dass es besser ist, anstelle von new und delete lieber einen container wie vector zu benutzen. Leider habe ich bisher nicht so richtige Beispiele gefunden und komme auch nicht so richtig auf eine Idee wie man folgendes mit einen vector lösen könnte:

    Klasse* erstelle_zeiger() { return new Klasse; }
    

    Dazu gibt es natürlich auch noch eine Zeiger-löschen Funktion. Wäre natürlich schön, wenn man in dem Block, in dem man sich den Zeiger erstellen lässt, ihn am Blockende nicht wieder händisch löschen muss.
    Wie löst man soetwas mit vector? Vielleicht könnt ihr bitte mal ein paar Beispiele geben, so mit new - besser mit vector?

    Hier benutzt man nicht Vector, schließlich willst du kein Array. Hier würde ich empfehlen einfach ein Stackobjekt zurückzugeben; Falls es aber umbedingt notwendig ist (und es muss schon verdammt notwendig sein 😃 ), nimm einen [s]shared_ptr[/s] unique_ptr (aufgrund wiederholter subtiler Meckereien editiere ich jetzt).

    Beispiel wo vector sehr gut ist:

    so mit new:

    int* meins = new int[ eingeleseneVariable ];
    

    so mit std::vector :

    std::vector<int> meins(eingeleseneVariable);
    
    int* getArray()
    {
        return new int[ eineAndereVariable ];//Achtung, Größe unbekannt für Funktionsaufrufer, erzwingt magic constants
    }
    

    ➡

    std::vector<int> getArray()
    {
        return std::vector<int>( eineAndereDuweistschon );
    }
    

  • Mod

    vector ist was für Arrays, nicht für einzelne Objekte. Du suchst einen Smartpointer.

    Die wahre Frage ist: Was willst du mit dem Konstrukt erreichen? Polymorph ist die Klasse offensichtlich nicht, wieso dann überhaupt new?



  • Nein, vector will man statt new[] und delete[]. Für new und delete nimmt man smart Pointer wie shared_ptr oder unique_ptr. (Wenn du nicht weißt was shared_ptr ist oder macht, brauchst du ihn auch nicht.)

    std::unique_ptr<Klasse> foo() { return std::unique_ptr<Klasse>(new Klasse); }
    

    Der übernimmt das delete nämlich für dich. Move-Semantiken sollten dir allerdings klar sein. (std::move etc.) (Die sind erst mit C++11 verfügbar, bei GCC musst du da eventuell mit -std=c++0x oder -std=c++11 kompilieren.)

    Edit: oO Viel zu spät.

    SeppJ schrieb:

    Die wahre Frage ist: Was willst du mit dem Konstrukt erreichen? Polymorph ist die Klasse offensichtlich nicht, wieso dann überhaupt new?

    👍



  • Es muss kein vector sein. Hatte ich nur am meisten als Ersatz gelesen.



  • fragender12 schrieb:

    Es muss kein vector sein. Hatte ich nur am meisten als Ersatz gelesen.

    Gut, Antworten siehst du ja oben. Speicher überhaupt selbst zu allokieren sollte wo möglich (auch an refactoring denken, wenn man unnötig oft davon abhängig ist) immer vermieden werden.



  • Hacker schrieb:

    Falls es aber umbedingt notwendig ist (und es muss schon verdammt notwendig sein 😃 ), nimm einen shared_ptr unique_ptr.

    *fixed



  • Kellerautomat schrieb:

    Hacker schrieb:

    Falls es aber umbedingt notwendig ist (und es muss schon verdammt notwendig sein 😃 ), nimm einen shared_ptr unique_ptr.

    *fixed

    Kommt doch auf den Verwendungszweck an. Zumindest war "auto_ptr" nicht zu lesen.



  • Per default shared_ptr zu nehmen ist Schwachsinn.



  • Danke.
    In den meisten von mir gesehen Beiträgen ging es um c-Arrays. Da würde ich sowieso immer container nehmen. Nur das mit dem vector statt new verwirrte mich. Aber jetzt bin ich da auch wieder ein wenig wissender.
    In den anfangs von mir verwendeten Beispiel habe ich mich für unique_ptr entschieden. Habe es auch schon ausprobiert und funktioniert so wie ich es mir vorstellte.
    Es sieht jetzt so aus:

    std::unique_ptr<KlasseBasis> foo() { return std::unique_ptr<KlasseBasis>(new KlasseAbgel); }
    

Log in to reply