Stworzyłem typ Tablica, w main() tworzę tablicę typu Tablica dynamicznie.
przy zwalnianiu pamięci za pomocą delete dzieją się dziwne rzeczy, sprawdzam w menedżerze procesów czy zwalnia.
kiedy źle zwalnia to jest:
np. startuje z 100kB, new podbija do 40 MB, a po delete jest 33,6 MB,
a jak dobrze to wtedy po delete wraca do ~100kB
DOBRZE zwalnia kiedy:
+ np. kiedy utworze sobie dynamicznie jeszcze jakiś osobny typ Tablica i go zwolnię, to przy tym zwalnianiu zaczyna działać ten delete mojej tablicy Tablic
+ kiedy RozmiarTablicy(z main) > 100 000 to delete zwalnia poprawnie pamięć, IloscTablic nie ma znaczenia
+ kiedy w pętli w której tworzę w tablicy elementy typu Tablica, zaraz po utworzeniu 'Ptr = new Tablica(RozmiarTablicy)' robię 'delete Ptr'
ŹLE zwalnia
- ale kiedy już robię 'delete Ptr' w osobnej pętli to nie działa
a właśnie najpotrzebniejsze jest to wyżej co ŹLE działa.
zrobiłem sobie trochę komunikatów w programie do logowania, i za każdym razem jak wywołuje mi destruktor to wskaźnik, który usuwa == wskaźnikowi utworzonemu przez konstruktor, także to jest ok. i żadnych błędów przy kompilacji ani uruchamianiu.
Kod: Zaznacz cały
class Tablica {
public:
Tablica() {
_RozmiarTablicy = 0;
_PTab = NULL;
}
Tablica(unsigned long int Rozmiar) {
_RozmiarTablicy = Rozmiar;
_PTab = TworzTablice(_RozmiarTablicy);
}
~Tablica() {
delete [] _PTab;
_PTab = NULL;
}
int* TworzTablice(unsigned long int Rozmiar) {
int *PTmp = new int[Rozmiar];
return PTmp;
}
private:
int *_PTab;
unsigned long int _RozmiarTablicy;
}; //-----------------------
int main() {
Tablica **Ptr = NULL;
unsigned long int IloscTablic = 10;
//dopiero przy RozmiarTablicy > 100 000 zwalnia pamiec
unsigned long int RozmiarTablicy = 100000;
getchar();
Ptr = new Tablica *[IloscTablic];
for(unsigned long int i = 0; i < IloscTablic; i++) {
Ptr[i] = new Tablica(RozmiarTablicy);
//jak zwalniam w petli od razu to dziala
//delete Ptr[i];
//Ptr[i] = NULL;
}
getchar();
//to nie chce dzialac kiedy RozmiarTablicy < 100 000
for(unsigned long int i = 0; i < IloscTablic; i++) {
delete Ptr[i];
Ptr[i] = NULL;
}
delete [] Ptr;
Ptr = NULL;
getchar();
}
//edit może muszę własne new i delete zrobić ?? może mi ktoś napisać jaki ma sens tworzenie własnych new i delete (z malloc i free w środku) ?