kleines problem

12/12/2015 19:32 Slade100#1
hey leute,
kleines problem
undzwar in dem code(ist nur ein sinnfreies beispiel)
das problem ist das die ausgaben vom Array A in klasse B schwachsinnig sind.
Code:
class A{
	int *x;
public :
	A(){
		x = NULL;
	}
	A(int x){
		this->x = new int(x);
                cout << *this->x << endl; // 41 85 72
	}
	int getx(){ 
		return *x; }

	~A(){ delete x; }
};

class B{
public:
	A a[20];
	int Anz;
	B(int Anzahl){
		Anz = Anzahl;
		for (int i = 0; i < Anz; i++){
			a[i] = A(rand() % 101);
		}
		for (int i = 0; i < Anz; i++){
			cout << i + 1 << ".\t" << a[i].getx() << endl; // sollte 41 85 72 sein ist aber schwachsinn^^
		}
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	B a(3);
	return 0;
}
die Ausgabe:
41
85
72
1. -17891602
2. -17891602
3. -17891602

1, 2 und 3 sollten genau wie die oberen zahlen sein.
Ich weiß das das problem von dem delete in klasse A kommt.
die Lösung die ich dafür hätte wäre das ich extra eine set funktionen für x setzte und dann a[i].setx(rand()%101) benutze.
Aber am liebsten würde ich das wenn möglich mit dem init konstruktor lösen den ich habe.
Ist das denn möglich?
12/12/2015 22:57 MuffinMario#2
Der Dekonstruktor wird auch aufgerufen, wenn du ihn nicht selbst mit delete aufrufst. Zum Beispiel beim Ende von main.
Ich bin mir hier echt nicht sicher, aber ich glaube keinen Pointer zu benutzen wird hier auch reichen. Nebenbei bemerkt kommt diese komische negativ-Zahl davon, dass dem Wert einer Adresse, wo der Pointer hinzeigt keine gültige Zahl ist bzw. nicht initalisiert ist. Hier erkennt man sofort, dass das delete, wie du schon erwähntest, ein Problem spielt. Du könntest natürlich auch einen smart pointer (auto_ptr) benutzen, welcher dir das Leben hoffentlich leichter machen würde. Aber hier wird der Konstruktor vor der Rückgabe einer Memberfunktion aufgerufen. Ich kenne mich jetzt intern damit nicht wirklich aus und ich habe hier einfach mal ein bisschen geraten. Also einfach das gleiche machen ohne einen Pointer löscht den Speicher auch ohne Destruktor
Code:
class A {
	int x;
public:
	A() {}
	A(int i) {
		x = i;
		std::cout << x << std::endl; // 41 85 72
	}
	int getx() {
		return x; // returns value without memory leak
	}
};