• 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.

Object Storage Arubacloud
0 głosów
277 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 842 wizyt
0 głosów
1 odpowiedź 1,544 wizyt
0 głosów
1 odpowiedź 172 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...