• 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

0 głosów
1,797 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 (195,220 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ź 565 wizyt
0 głosów
3 odpowiedzi 3,673 wizyt
0 głosów
2 odpowiedzi 709 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 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.

...