fragen zum zeiger



  • Servus, lese mir gerade einen Artikel zum Zeiger durch.

    Dort wurde mir soweit erklärt, dass man Zeiger fast immer durch den Referenzoperator ersetzen kann bis auf bei einem Fall:

    - Wenn man zur Laufzeit nicht weiß, wieviel Speicherplatz man reservieren muss.

    Beim Array kann ich es noch nachvollziehen, weil man da oft nicht weiß wieviele Elemente man anlegen möchte.

    Aber da sind auch Beispiele wie:

    int *i = new int; 
    *i = 169; 
    delete i;
    

    aufgetaucht.
    Das verstehe ich nicht. Int kann doch sowieso nur 4 Byte groß sein (max)? Da macht es doch kein Sinn via "new" ein Speicher"bereich" zu reservieren?


  • Mod

    Das hast du richtig erkannt, das Beispiel ist eher ein Gegenbeispiel was man nicht tun sollte.



  • D.h. Speicherplatz via "new" zu reservieren macht nur beim Arrays Sinn?



  • cometi schrieb:

    D.h. Speicherplatz via "new" zu reservieren macht nur beim Arrays Sinn?

    Meistens nicht einmal dann. 😉

    Zum Einen: Manuelle Speicherverwaltung ist derart aufwendig und fehleranfällig (und oft noch langsam dazu), dass man sie nur wählen sollte, wenn es wirklich nicht anders geht. Für seeeehr viel gibt es in C++ bereits Sprachelemente (std::string, std::vector, ....), die es einem ersparen, sich damit rumzuschlagen.

    Zum Anderen: "Zeiger != manuelle Speicherverwaltung"
    Ja - wenn man manuelle Speicherverwaltung machen will/muss, sind Zeiger oftmals das Mittel der Wahl, um die Objekte anzusprechen. Aber eigentlich sind Zeiger einfach allgemein "Verweise auf Objekte". Man kann sie in vielen Kontexten prima verwenden, die nichts mit Speicherverwaltung zu tun haben.
    Beispiel

    struct A {};
    struct B {
       A* meinA;
    };
    
    int main() {
       A a1, a2; // 2 As werden erzeugt
       B b; // mein B wird erzeugt
       b.meinA = &a1; // jetzt "kennt" b a1 ...
       b.meinA = &a1; // ... und jetzt "kennt" es a2.
    

    Gruß,

    Simon2.



  • cometi schrieb:

    D.h. Speicherplatz via "new" zu reservieren macht nur beim Arrays Sinn?

    Es macht nur Sinn, wenn es nicht anders geht. Auch ein Array lässt sich ohne new anlegen, wenn die Dimensionen vorher bekannt sind. Sind sie nicht bekannt, so ist ein new erforderlich und du hast keine andere Wahl.

    Es gilt aber: Wenn man new vermeiden kann, dann sollte man das auch tun.



  • Ein std::vector hat die selbe Performance wie ein per new erzeugtes Array und ist dabei "sicher" 😉


Anmelden zum Antworten