Speicher von Objekten: Heap, Stack und ?



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    class Klasse 
    { 
    private:
    	string _name;
    public: 
    	Klasse(string name) { _name = name; cout << "Objekt " << _name << " erzeugt."  << "Adresse: " << this << endl; }
    	~Klasse()           {               cout << "Objekt " << _name << " vernichtet." << endl; }
    };
    
    Klasse a("10a");
    
    int main()
    {
    	Klasse * px = new Klasse("10x");
    	{
    		Klasse b("10b");
    	}
    	Klasse c("10c");
    	Klasse d("10d");
    	delete px;
    
    	return 0;
    }
    

    Klasse b, c und d wird auf dem Stack errichet. Speicheradressen sind abnehmend mit dem Abstand von 16 bit (0x12FF58, 0x12FF48, 0x12FF38). Warum 16 bit, was umfassen diese 16 bit genau? Warum abnehmend? Wie groß ist so ein Stack eigentlich? Mit wieviel Objekten mit 16 bit kann man den überfüllen? Gibt es hier einen Schutzmechanismus (C++, OS)?

    Klasse x, y und z wird auf dem Heap erzeugt. Adresse weit oberhalb vom Stack, also keine Stack-Heap-Kollision möglich. Die Adressen sind jetzt aber nicht jeweils 16 bit auseinander (0x301E50, 0x301CA0, 0x301B10, auch keine gleichen Abstände?! warum so chaotisch? warum abnehmend, ist das immer so?). Wenn man "delete px" usw. vergisst, so gibt es doch ein Speicherloch. Wie kann ich das mit z.B. MSVC++ oder anderen Compilern detektieren, damit das nicht passiert?

    Klasse a wird "global" erzeugt. Der Speicher ist nochmal deutlich oberhalb des Heaps (0x477748). Das Objekt wird innerhalb des Programms nicht vernichtet (Destruktor wird nicht aufgerufen). Passiert dies automatisch durch das OS oder gibt es hier ebenfalls ein Speicherloch im globalen(?) Speicher?

    Wie sind generell Stack, Heap und globaler(?) Speicher organisiert. Wie heißt der letzte Speicher für Variablen/Objekte außerhalb von main()?

    Gibt es ein Tutorial, einen Link, der diese Sachverhalte wirklich ganz genau beschreibt?



  • int main()
    {
    	Klasse * px = new Klasse("10x");
    	Klasse * py = new Klasse("10y");
    	Klasse * pz = new Klasse("10z");
    	{
    		Klasse b("10b");
    	}
    	Klasse c("10c");
    	Klasse d("10d");
    	delete px;
    	delete py;
    	delete pz;
    
    	return 0;
    }
    

    y und z vergessen.



  • Warum 16 bit, was umfassen diese 16 bit genau?

    also eigentlich ein Objekt vom Typ string. Warum das genau 16bit sind liegt an der Implementierung des Typen

    Warum abnehmend? Wie groß ist so ein Stack eigentlich? Mit wieviel Objekten mit 16 bit kann man den überfüllen? Gibt es hier einen Schutzmechanismus (C++, OS)?

    das hängt von deiner Platform ab. Ohne genaue Informationen kann man dazu nichts sagen

    Die Adressen sind jetzt aber nicht jeweils 16 bit auseinander (0x301E50, 0x301CA0, 0x301B10, auch keine gleichen Abstände?! warum so chaotisch? warum abnehmend, ist das immer so?).

    Der Heap funktioniert ja auch anders. Dort wird eben Speicher reserviert, wo gerade Speicher frei ist.

    Wie kann ich das mit z.B. MSVC++ oder anderen Compilern detektieren, damit das nicht passiert?

    die Compiler entdecken das nicht. Wenn du Speicherlöcher finden willst, dann kannst du dir Programme wie valgrind oder Librarys wie efence besorgen, damit kannst du Speicherlöcher finden. Theoretisch sollte das aber auch möglich sein vor dem compilieren zu entdecken. Man muss ja eigentlich nur zählen, wann die letzte Referenz zu dem Objekt zerstört wird.

    Das Objekt wird innerhalb des Programms nicht vernichtet (Destruktor wird nicht aufgerufen).

    hmm, dass ist merkwürdig. AFAIK müsste das Objekt auch ordentlich zerstört werden



  • der destruktor wird natuerlich schon aufgerufen, aber erst nachdem der destruktor fuer cout aufgerufen wurde.
    folglich gibt es keine bildschirm ausgabe mehr.
    schreib das mal in eine datei - dann wirst du sehen, dass auch globale objekte zerstoert werden.



  • 16 Byte anstelle 16 Bit, wenn ich nicht irre.


Anmelden zum Antworten