• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Czy jest tutaj wyciek pamięci ?

Object Storage Arubacloud
0 głosów
345 wizyt
pytanie zadane 1 stycznia 2018 w C i C++ przez nik Obywatel (1,640 p.)
zamknięte 1 stycznia 2018 przez nik

Witam. Czy jest tutaj wyciek pamięci? Według mnie nie, bo wartość pierwszego elementu została ustawiona na NULL czyli na nic i komórka ta może zostać wykorzystana przez inny proces, można to zrobić jakoś z delete? Próbowałem tworzyć zmienną pomocniczą ale usuwa mi całą tablicę.

int main()
{
	int *tab = new int[4];
	tab[0] = 1;
	tab[1] = 2;
	tab[2] = 3;
	tab[3] = 4;

	for (int i = 0; i < 4; i++)
		cout << *(tab + i) << endl;

	cout << "Po usunieciu" << endl;
	tab[2] = tab[0];
	tab[0]=NULL;
	tab++;

	for (int i = 0; i < 3; i++)
		cout << *(tab + i) << endl;

	cout << "First line of code" << endl;
	cin.ignore();
    return 0;
}

 

komentarz zamknięcia: Problem rozwiązany.

1 odpowiedź

+1 głos
odpowiedź 1 stycznia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
wybrane 1 stycznia 2018 przez nik
 
Najlepsza

Według mnie nie, bo wartość pierwszego elementu została ustawiona na NULL czyli na nic i komórka ta może zostać wykorzystana przez inny proces

To, jaką wartość ma pierwszy (i każdy kolejny) element nie ma znaczenia. Pamięć alokowana dynamicznie jest zarządzana przez system operacyjny, który musi dostać wyraźny sygnał - prośbę o alokację danych lub zwolnienie tych danych.

Choć z tego co mi wiadomo, to w tego typu prostych przypadkach (gdzie nie alokuje się danych dynamicznie w pętli) dane zostaną zwolnione same (choć nie wiem jak to dokładnie działa).

A żeby móc potem zwolnić dane przez delete, najlepiej nie zmieniać wartości wskaźnika (czyli nie inkrementuj tab, lepiej utwórz nowy wskaźnik i to jemu przypisz jakąś tam nową wartość).

1
komentarz 1 stycznia 2018 przez j23 Mędrzec (194,920 p.)

choć nie wiem jak to dokładnie działa

Zapewne system podczas zamykania procesu i jego stert(y) sprawdza, czy pozostała jeszcze jakaś niezwolniona pamięć i w razie potrzeby zwalnia ją.

 

Oczywiście nie ma mowy o wywoływaniu destruktorów...

1
komentarz 1 stycznia 2018 przez the_danger Gaduła (4,800 p.)

Choć z tego co mi wiadomo, to w tego typu prostych przypadkach (gdzie nie alokuje się danych dynamicznie w pętli) dane zostaną zwolnione same (choć nie wiem jak to dokładnie działa).

Nowoczesne systemy operacyjne po zamknięciu programu sprzątają po nim. Czyli między innymi oddają zaalokowaną pamięć z powrotem do użycia dla innych procesów.

komentarz 1 stycznia 2018 przez nik Obywatel (1,640 p.)
Czyli nie można zrobić czegoś takiego jak usunięcie zwolnienie pamięci z pierwszego elementu i w efekcie mamy rozmiar tablicy 3 a nie 4 ?
1
komentarz 1 stycznia 2018 przez j23 Mędrzec (194,920 p.)

Nie. Do takich rzeczy masz klasę std::vector.

1
komentarz 1 stycznia 2018 przez nik Obywatel (1,640 p.)
Więc, aby zrealizować usuwanie z dynamicznej tablicy to jako jedyny sposób trzeba ją przepisać pomijając dany element?
2
komentarz 1 stycznia 2018 przez j23 Mędrzec (194,920 p.)
  • stworzyć nową tablicę o jeden element mniejszą,
  • przepisać do niej zawartość starej tablicy z pominięciem usuwanego elementu,
  • usunąć starą tablicę,
  • przypisać wskaźnikowi tab adres nowej tablicy.

Inna opcja, bez realokacji, to po prostu przesunięcie elementów tablicy znajdujących się za usuwanym elementem do przodu.

komentarz 1 stycznia 2018 przez nik Obywatel (1,640 p.)
Dzięki wszystkim, sytuacja opanowana :)

Podobne pytania

0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 25 sierpnia 2020 w C i C++ przez fortuna Początkujący (310 p.)
+3 głosów
1 odpowiedź 462 wizyt
pytanie zadane 30 czerwca 2017 w C i C++ przez Madar Obywatel (1,560 p.)
0 głosów
1 odpowiedź 193 wizyt
pytanie zadane 30 listopada 2017 w C i C++ przez Kube Obywatel (1,180 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...