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

Dynamiczne alokowanie i zwalnianie pamięci dla tablicy dwuwymiarowej

Object Storage Arubacloud
0 głosów
1,543 wizyt
pytanie zadane 7 maja 2018 w C i C++ przez BlinkyShay Obywatel (1,190 p.)

Witam, napisałem program do zwalniania i alokowania pamięci dla tablicy dwuwymiarowej o wybranym rozmiarze.
Mam jednak pytanie czy jest on napisany poprawnie, sam program oczywiście się kompiluje i wydaje się działać, jednak wskaźniki to dla mnie nowy temat i chciałbym się upewnić.
 

#include <iostream>
using namespace std;

int **alokacjaPamieci(int wysokosc, int szerokosc)
{
    int **tablica = new int*[wysokosc];

    for(int i = 0; i < wysokosc; i++)
    {
        tablica[i] = new int[szerokosc];
    }

    for(int i = 0; i < wysokosc; i++)
    {
        for(int j = 0; j < szerokosc; j++)
        {
            tablica[i][j] = 1;
        }
    }

    return tablica;
}

void wypisz(int **tablica, int wysokosc, int szerokosc)
{
    for(int i = 0; i < wysokosc; i++)
    {
        for(int j = 0; j < szerokosc; j++)
        {
            cout << tablica[i][j] << " ";
        }
        cout << endl;
    }
}

void zwalnianiePamieci(int **tablica, int wysokosc)
{
    for(int i = 0; i < wysokosc; i++)
    {
        delete []tablica[i];
    }

    delete []tablica;
}

int main()
{
    int **tablica, wysokosc, szerokosc;

    cout << "Podaj wysokosc i szerokosc tablicy: ";
    cin >> wysokosc >> szerokosc;

    //Alokacja pamieci
    tablica = alokacjaPamieci(wysokosc, szerokosc);

    //Wypisanie tablicy
    wypisz(tablica, wysokosc, szerokosc);
    cout << tablica[0][0] << endl;

    //Zwolnienie pamieci
    zwalnianiePamieci(tablica, wysokosc);

    tablica[0][0] = 100;
    cout << tablica[0][0];
}

Widzę że pomimo tego iż zwolniłem pamięć pod koniec programu, to nadal mogę zmienić wartość w komórce oraz ją wyświetlić. Czy to oznacza że źle zwolniłem pamięć? Zdaje sobie sprawę że powinienem po zwolnieniu pamięci przypisać wskaźnikowi NULL'a, jednak testuje różne opcje.
Mam jeszcze jedno pytanie, mianowicie czy wskaźniki jakie występują w c++ są też w innych językach? Wiem że w niektórych występują ale czy są one podobne czy może ich używanie jest prostsze od tych w c++.

1 odpowiedź

+1 głos
odpowiedź 7 maja 2018 przez j23 Mędrzec (194,920 p.)

Czy to oznacza że źle zwolniłem pamięć?

Nie. To oznacza, że miałeś szczęście. Zwolnienie pamięci nie zawsze oznacza, że od razu przestaje być dostępna, po prostu jest oznaczona do ponownego użycia. To wynika ze sposobu działania sterty.

Podobne pytania

0 głosów
1 odpowiedź 277 wizyt
0 głosów
3 odpowiedzi 3,021 wizyt
0 głosów
2 odpowiedzi 427 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)

92,576 zapytań

141,425 odpowiedzi

319,650 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!

...