Probleme mit statischer Membervariable / new Klasse



  • Hallo Community!
    Ich habe ein Problem bei dem reservieren von Speicherplatz für eine Klasse. Ich weiß nicht genau wo die Fehlerquelle liegt,
    aber als ich das ganze ohne die Variable cObj probiert habe funktionierte es noch einwandfrei. ^^

    Code:

    #include <iostream>
    using namespace std;
    
    class example {
    private:
    	static int counter;
    	int cObj;
    
    public:
    	int var;
    
    	example() {
    		cObj = ++counter;
    		if (!cObj) cout << endl;
    		cout << "  create #" << cObj << endl;
    	}
    
    	~example() {
    		--counter;
    		cout << "  delete #" << cObj << endl;
    		if (!counter) cout << endl;
    	}
    };
    
    int example::counter = 0;
    
    void main() {
    	example *pArr[3];
    	int index = sizeof(pArr) / sizeof(example);
    
    	for (int i = 0; i < index; ++i) {
    		pArr[i] = new example;
    	}
    
    	cout << endl;
    
    	pArr[1]->var = 12;
    	delete pArr[0];
    
    	for (int i = 1; i < index; ++i) {
    		delete pArr[i];
    	}
    }
    

    Hier ohne cObj:

    #include <iostream>
    using namespace std;
    
    class example {
    private:
    	static int counter;
    
    public:
    	int var;
    
    	example() {
    		if (!counter) cout << endl;
    		cout << "  create #" << ++counter << endl;
    	}
    
    	~example() {
    		cout << "  delete #" << counter-- << endl;
    		if (!counter) cout << endl;
    	}
    };
    
    int example::counter = 0;
    
    void main() {
    	example *pArr[3];
    	int index = sizeof(pArr) / sizeof(example);
    
    	for (int i = 0; i < index; ++i) {
    		pArr[i] = new example;
    	}
    
    	cout << endl;
    
    	pArr[1]->var = 12;
    	delete pArr[0];
    
    	for (int i = 1; i < index; ++i) {
    		delete pArr[i];
    	}
    }
    

    Das muss irgendwas mit der statischen Membervariable zu tun haben.
    Aber ich komme nicht dahinter was es ist.
    Ich hoffe ihr könnt mir helfen! 🙂



  • wie wärs wenn du uns die compilermeldung nicht vorenthältst?



  • Hey, es gibt keine...
    Das Programm stürzt lediglich ab.
    Und zwar NACHDEM die erste for Schleife einmal komplett ausgeführt wurde.



  • Das kommt davon wenn man manuell mit Speicher rumspielt.
    Bei der Berechnung des index, das soll wohl die Gesamtgröße sein oder?
    Die Größe eines Arrays erhalt man via:
    sizeof(arr) / sizeof(element_in_arr)
    Du schreibst:
    sizeof(arr) / sizeof(example)
    In dem Array sind aber keine examples, sondern Pointer darauf!
    Als example noch genauso groß war wie ein Pointer (ohne cObj) ging das, mit cObj nicht mehr, weil example nun nicht mehr so groß wie ein Pointer ist.
    BTW: Rule of Three verletzt.



  • Tatsache...
    Vielen dank ^^
    Lässt sich aber der index nicht trotzdem errechnen ohne die Anzahl der Elemente zu kennen?



  • Make-Grafik schrieb:

    Tatsache...
    Vielen dank ^^
    Lässt sich aber der index nicht trotzdem errechnen ohne die Anzahl der Elemente zu kennen?

    Ja, das geht:

    int index = sizeof(pArr) / sizeof(*pArr);
    

    Aber benutze besser gleich std::vector. Ausserdem musst du in C++ nicht alle Objekte mit 'new' zu erzeugen.

    Kann es sein, dass du von Java her kommst?

    *Edit
    Es ist übrigens

    int main()
    

    und nicht

    void main()
    

    🙂



  • Nicht wirklich ^^
    Ich programmiere Hauptsächlich in einer Skriptsprache namens AutoIt.
    Mit dieser wird für gewöhnlich nicht mit Pointern gearbeitet...
    C++ lerne ich jetzt erst noch nebenbei. Alles was Pointer betrifft ist noch ziemlich neu für mich.
    Die Klasse std::vector ist mir bekannt, trotzdem danke für den Hinweis.

    €dit:
    Ich benutze Visual Studio Express 2012. Dort ist diese Syntax erlaubt.
    Weil ich meist immer das Return Schlüsselwort vergesse in der main Funktion,
    nehme ich direkt immer void weil's einfach einfacher für mich ist.
    Rückgabewerte vom Programm habe ich bisher noch nicht gebraucht ^^


  • Mod

    Make-Grafik schrieb:

    Ich benutze Visual Studio Express 2012. Dort ist diese Syntax erlaubt.

    Dann funktioniert's aber nur da.

    Weil ich meist immer das Return Schlüsselwort vergesse in der main Funktion,
    nehme ich direkt immer void weil's einfach einfacher für mich ist.

    Dann ist ja gut, dass C++ nicht C ist, denn in C++ ist ein return 0 in der main implizit.



  • Make-Grafik schrieb:

    €dit:
    Ich benutze Visual Studio Express 2012. Dort ist diese Syntax erlaubt.

    Und zwar nur aus Gründen der Abwärtskompatibilität mit ururururalten Versionen von Visual C++. In Standard C++ ist void main() nicht erlaubt.

    Make-Grafik schrieb:

    Weil ich meist immer das Return Schlüsselwort vergesse in der main Funktion,
    nehme ich direkt immer void weil's einfach einfacher für mich ist.
    Rückgabewerte vom Programm habe ich bisher noch nicht gebraucht ^^

    Für int main() gibt es die Ausnahmeregeleung, dass du auf das return dort drin auch verzichten darfst, was gleichwertig mit einem return 0; ist (in jeder anderen Funktion mit Returnwert vom Typ int wäre das natürlich nicht erlaubt). Verwend also besser einfach int main()... 😉


Anmelden zum Antworten