Array oder Pointer?



  • Hallo Community,
    ich bin Cpp Neuling und versuche es gerade anhand eines Video Tutorials zu lernen.
    In dem Tutorial wurden 2 Arrays[10] in der main Funktion erstellt und befüllt.
    Im nächsten Schritt wurde eine weitere Funktion für die Ausgabe erstellt und die Parameter als Pointer definiert. Übergeben werden die beiden Arrays.

    #include <iostream>
    
    double bremsweg(int geschwindigkeit){
    	double weg = (double)geschwindigkeit / 10;
    	return weg*weg;
    }
    
    void ausgabe(int *pGeschwindigkeit, double *pBremsweg, int anzahl){
    	for (int i = 0; i < anzahl; i++){
    		std::cout << pGeschwindigkeit[i] << " " << pBremsweg[i] << std::endl;
    	}
    	std::cin.get();
    	std::cin.ignore();
    }
    
    int main(){
    	double bremswege[10];
    	int geschwindigkeiten[10];
    	int i = 0;
    
    	for(unsigned int geschwindigkeit = 10; geschwindigkeit <= 100; geschwindigkeit+=10){
    		double weg = bremsweg(geschwindigkeit);
    		geschwindigkeiten[i] = geschwindigkeit;
    		bremswege[i] = weg;
    		i++;
    	}
    
    	ausgabe(geschwindigkeiten, bremswege, 10);
    
    	return 0;
    }
    

    Danach wurde ein alternativer Weg gezeigt über new.

    #include <iostream>
    
    double bremsweg(int geschwindigkeit){
    	double weg = (double)geschwindigkeit / 10;
    	return weg*weg;
    }
    
    void ausgabe(int *pGeschwindigkeit, double *pBremsweg, int anzahl){
    	for (int i = 0; i < anzahl; i++){
    		std::cout << pGeschwindigkeit[i] << " " << pBremsweg[i] << std::endl;
    	}
    	std::cin.get();
    	std::cin.ignore();
    }
    
    int main(){
    	double *bremswege = new double[10];
    	int *geschwindigkeiten = new int[10];
    	int i = 0;
    
    	for(unsigned int geschwindigkeit = 10; geschwindigkeit <= 100; geschwindigkeit+=10){
    		double weg = bremsweg(geschwindigkeit);
    		geschwindigkeiten[i] = geschwindigkeit;
    		bremswege[i] = weg;
    		i++;
    	}
    
    	ausgabe(geschwindigkeiten, bremswege, 10);
    
    	delete[] bremswege;
    	delete[] geschwindigkeiten;
    
    	return 0;
    }
    

    Das verwirrt mich jetzt, weil ich mich Frage, was das soll?
    Es macht doch sichtlich beides das selbe.



  • Vergiss Videotutorials für C++!

    New legt das Array auf dem Freispeicher an, die andere Version auf dem Stack. Ein gutes Buch sollte den Unetrschied erklären.



  • manni66 schrieb:

    Vergiss Videotutorials für C++!

    New legt das Array auf dem Freispeicher an, die andere Version auf dem Stack. Ein gutes Buch sollte den Unetrschied erklären.

    Ob Stack oder Heap ist doch egal oder nicht?



  • Die eine Variante legt das Array auf dem Stack ab, die andere auf dem Heap.
    Wichtig ist, dass bei der Heap-Variante der mit new angeforderte Speicher auch wieder freigegeben muss (mit delete oder bei Arrays mit delete[]). Wenn das vergessen wird oder das delete aus irgendeinem Grund nicht ausgeführt wird (beispielsweise eine exception) dann führt das zu einem Memory Leak. Das bedeutet das Programm hat Speicher angefordert, weiß aber nicht mehr wo dieser liegt und kann ihn deshalb nicht mehr freigeben.

    Es gibt in C++ Klassen, die das freigeben (und manche auch das reservieren) für dich übernehmen. std::vector ist ein sich selbst vergrößerndes Array. Je nach dem wie viel Platz man braucht, fordert er mehr Speicher an. Am Ende gibt er ihn wieder frei.

    std::unique_ptr ist ein Pointer, der den Speicher, bevor er selbst zerstört wird, freigibt. Er ist nicht kopierbar, d.h. nur einer kann den Speicherbereich "besitzen", wenn er weg ist, ist auch der Speicher weg.

    std::shared_ptr kann kopiert werden, erst wenn die letzte Kopie zerstört wird, wird auch der Speicher freigegeben.

    Der einfachste Weg ist aber immer der Stack. Nur wenn es dort nicht geht, sollte man den Heap benutzen. (Wenn man std::array auf dem Stack anlegt, ist auch das interne Array dort)

    Während dem Schreiben noch reingekommen:

    Ob Stack oder Heap ist doch egal oder nicht?

    Beim Heap kannst du die zu reservierende Größe selbst bestimmen, beim Stack muss sie beim kompilieren feststehen. Im zweiten Beispiel kannst du den User fragen, wie viele Bremswege berechnet werden sollen, beim ersten werden es immer maximal 10 sein.



  • owned139 schrieb:

    manni66 schrieb:

    Vergiss Videotutorials für C++!

    New legt das Array auf dem Freispeicher an, die andere Version auf dem Stack. Ein gutes Buch sollte den Unetrschied erklären.

    Ob Stack oder Heap ist doch egal oder nicht?

    Klar, Kerninghan hat den Stack erfunden, Ritchie den Heap. Und weil sie sich nicht einigen konnten, haben sie beides in C eingebaut.

    Ohne den Verstand einzuschalten wird das nichts mit programmieren.



  • @manni:
    Troll woanders.

    Danke dir Patrick 🙂



  • Das Wichtigste hat patrick246 bereits gesagt, vielleicht nochmals zur Verdeutlichung: In produktivem und modernem C++-Code hat man praktisch nie new und delete , und wenn, dann nur gut abgekapselt. Schau dir das RAII-Idiom an, es ist eines der wichtigsten Konzepte in C++ überhaupt. In der Realität wirst du viel Code antreffen, der sich kaum darum schert (ein Grossteil des C++-Codes ist fragwürdig in dieser Hinsicht), lass dich dadurch nicht beirren.

    Wenn du ausführlichere Antworten zu "Stack vs. Heap" brauchen kannst, findest du über Suchmaschinen Beiträge wie diesen hier. Übrigens wird teilweise auch zwischen Heap und Freestore unterschieden.


Log in to reply