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

Dynamiczne alokowanie pamięci new-delete , nie działa zwalnianie pamięci.

0 głosów
562 wizyt
pytanie zadane 21 marca 2018 w C i C++ przez DawidCpp Nowicjusz (120 p.)
edycja 21 marca 2018 przez DawidCpp
#include <iostream>

using namespace std;
int n;
int main()
{
    cout<<"Podaj liczbe calkowita: ";
    cin>>n; //creat n.
    int *tablica;
    tablica= new int [n]; //creat new array "tablica"

    cout<<tablica[0]<<"  "<<tablica[1]<<"  "<<tablica[2]<<"  "<<n<<endl; //showing value array[o] array[1] array [2] and n.

    delete [] tablica; //clean memory
    cout<<tablica[0]<<"  "<<tablica[1]<<"  "<<tablica[2]<<"  "<<n<<endl; // showing random values of array . 

    return 0;
}

Witam,

Proszę o wyjaśnienie co w kodzie jest źle. 

Moja interpretacja jest taka:

Wskaźnik tworzy nową tabelę wielkości[n] , wyrzuca na ekranie wartości tabeli[0],[[1],[2]. Wyswietla n.

Dostaje polecenie delete - zwalnia pamięć. 

Wyświetla na nowo tabelę[0],[[1],[2]. oraz n. 

Według mnie podczas drugiego wyświetlenia wartości poszczególnych komórek powinny być losowe - ponieważ zwolniliśmy pamięć, ale program pokazuje wartości stworzonej powyżej tablicy.

Proszę o wyprowadzenie mnie z błędu lub ew. poprawę kodu. 

komentarz 21 marca 2018 przez JAKUBW Nałogowiec (33,470 p.)

Tablica została usunięta pomyślnie, odczyt tej pamięci może zakończyć się segfault, więc lepiej tego nie robić. A dane nadal są odczytywane takie jak były, bo żaden program ani system jeszcze nie poprosił o pamięć i jej nie dostał (w tym akurat miejscu), więc tymbardziej nie zmienił, więc dane nadal są takie jakie były. Aby sprawdzić czy dane zostały usunięte możesz użyć Menedżera zadań i dodać std::cin.get() przed każdą operacją - pamięć rzeczywiście się zwolni.

Spróbuj coś zapisać do tej pamięci a może się okazać, że już nie jest twoja (i będzie segfault).

komentarz 27 marca 2018 przez Paweł Dymek Bywalec (2,300 p.)

@DawidCpp,  

Wskaźnik tworzy nową tabelę wielkości[n]

Wskaźnik nic nie tworzy, wskaźnik wskazuje na konkretny adres w pamięci. Operator new tworzy tablicę o rozmiarze n, której pierwszy element jest pod adresem zapisanym we wskaźniku.

1 odpowiedź

0 głosów
odpowiedź 21 marca 2018 przez chucksqll Stary wyjadacz (12,930 p.)
U mnie po pierwsze wywala program  po wprowadzeniu liczby n.

Po drugie nie wydaje mi się, żeby wypisywanie nie zainicjowanych zmiennych, w tym przypadku tablica[i] jak i  odwoływanie się do komórek pamięci, w których nie wiesz co się znajduje było dobrym pomysłem.

Co do reszty kodu to błędu nie widzę.

Podobne pytania

0 głosów
2 odpowiedzi 1,614 wizyt
0 głosów
1 odpowiedź 1,795 wizyt
0 głosów
1 odpowiedź 503 wizyt

93,740 zapytań

142,675 odpowiedzi

323,294 komentarzy

63,319 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...