• 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

Cloud VPS
0 głosów
1,697 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,240 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ź 429 wizyt
0 głosów
3 odpowiedzi 3,408 wizyt
0 głosów
2 odpowiedzi 600 wizyt
pytanie zadane 10 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)

93,467 zapytań

142,460 odpowiedzi

322,734 komentarzy

62,847 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

Kursy INF.02 i INF.03
...