Alokowanie pamięci w konstru... przeładowanie opertorów

0

Witam.

Muszę stworzyć prosty program, w którym w konstruktorze dynamicznie alokuje 2 zmienne typu int.
Metodę wydrukuj, czyli wyswietlenie wartosci oraz - najwiekszy problem - przeladowanie operatorów

aby zapis z3 = z1 + z2 //(obiekty klasy Zespolona) był poprawny i działał.

Napisałem już kod, lecz mam glownie problem z przeładowaniem operatorow i byc może czegoś do konca nie zrozumiałem.

W każdym razie wygląda to tak :

http://pastebin.com/ZRB109wL

Prosiłbym o pomoc w poprawieniu tego i mam pytanie :

  1. Czy nie powinienem najpierw zadeklarowac zwyklych zmiennych, a dopiero potem zrobic wskazniki na nie?
1
 
        Zespolona operator+(const Zespolona &z1)
        {
		int *z = z1.A;
		int *y = z1.B;
        return Zespolona(*A + *z, *B + *y);
        }

Chociażby tak.
Nie zapomnij o konstruktorze kopiującym :)

0
Mały Terrorysta napisał(a):

Napisałem już kod, lecz mam glownie problem z przeładowaniem operatorow i byc może czegoś do konca nie zrozumiałem.

return Zespolona(*A + *z1.A, *B + *z1.B);
  1. Czy nie powinienem najpierw zadeklarowac zwyklych zmiennych, a dopiero potem zrobic wskazniki na nie?
    Wtedy to nie byłyby dynamicznie alokowane zmienne.
0

Serdecznie dziękuje za pomoc! wszystko działa :)

Nie wiedziałem że zapis *z1.A jest poprawny.. i próbowałem z1.*A

0

Mam jeszcze jedno pytanie.

W jaki sposób w owym programie, powinienem uzyć "Delete" i skasować dynamicznie zaalokowaną pamięć ? no i w którym miejscu to powinieniem robić ?
O ile rozumiem, to trzeba to robić, przed wyjściem z programu, a nie w trakcie jego pracy?

0

W destruktorze, tylko pamiętaj o konst.kopiującym, w którym zaalokujesz nowe inty.
Jeśli by go nie było pamięć byłaby kasowana 2 razy. ( tzw. płytka kopia)

0

Mógłbym prosić o przykładową implementacje konstruktora kopiującego w moim kodzie?

Nie do końca jestem pewny jaką on powinien mieć zawartość.

0

Trochę nie rozumiem koncepcji.. mam użyć konstruktora kopiującego, który zaalokuje nowe obiekty, starymi wartosciami ?
bo troche to bez sensu :(

2

Serdecznie dziękuje za pomoc! wszystko działa :)

Nie działa.

Masz tam wielkiego, brzydkiego i paskudnie trudnego w debuggowaniu memleaka.
Spójrz:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
using namespace std;

int allocs = 0;

class Foo {
public:
	void* operator new(size_t sz) {
		if(rand() % 2 == 0)
			throw bad_alloc();
		void* storage = malloc(sz);
		allocs += 1;
		return storage;
	}
	
	void operator delete(void* ptr) {
		allocs -= 1;
		free(ptr);
	}
};

class ExtremelyBadClass {
public:	
	ExtremelyBadClass() {
		f1 = new Foo();
		f2 = new Foo();
	}
	
	~ExtremelyBadClass() {
		if(f1 != nullptr) delete f1;
		if(f2 != nullptr) delete f2;
	}
	
private:
	Foo *f1, *f2;
};

int main() {
	srand(time(nullptr));
	
	vector<ExtremelyBadClass*> v;
	
	for(size_t i = 0; i < 1000; ++i) {
		try {
			v.push_back(new ExtremelyBadClass());	
		}
		catch(exception e) {
			
		}
	}
	for(auto obj : v) delete obj;
	
	
	printf("%d\n", allocs);
	
	return 0;
}

Dlaczego tak się dzieje?
#Jeśli drugie new rzuci wyjątek, pierwszy obiekt nie jest czyszczony (mimo, że zaalokowaliśmy mu miejsce na stercie).
#Pierwszy obiekt nie jest czyszczony ponieważ nie udało się stworzyć klasy przechowującej te wskaźniki.
#Nie wywołuję się destruktor bo żaden z konstruktorów nie został wykonany od początku do końca.

Możliwe rozwiązania.
#Nie trzymać więcej niż jednego pointera w klasie.
#Dodać konstruktor przypisujący nullptr obu wskaźnikom i wywołać go w drugim konstruktorze (przypisującym wartości).
#Używać smart pointerów.

Przeczytaj to: http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29 ad samego zarządzania zasobami. Przy okazji masz tam linki do tego co to konstruktor kopiujący, operator przypisania, etc., z którymi powinieneś się zapoznać.

0

Dziękuje za pomoc.

Teraz pytanie - czy byłby ktoś w stanie krotko poprawic moj program i dac do niego ten konstruktor kopiujacy i destruktor aby bylo tak jak powinno?
Czytam juz od 2h i proboje to zrobic, ale slabo mi idzie.

Z góry dziekuje

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.