Kasowanie zmiennych dynamicznych

0

Witam napisałem taki program

 #include <iostream>
using namespace std;

void wypelnij(int t[], int n, int zmienna)
{
    for (int i=0; i<n; i++)
    {
        t[i]=i;
        cout<<t[i]<<", ";
    }
    cout<<"\nZmienna dynamiczna= " << zmienna;
}

int main()
{
    int *tablica, *zmienna;
    int n;
    char a;
    zmienna = new int;
    cout<<"Podaj zmienną dynamiczną: ";
    cin>>*zmienna;
    cout<<"\nPodaj wielkość tablicy: ";
    cin>>n;
    tablica = new int[n];
    cout<<"Chcesz wypełnić tablice ?(t/n): ";
    cin>> a;
    if (a=='t')
        wypelnij(tablica, n, *zmienna);
    else
        cout<<"\nZmienna dynamiczna =  "<<*zmienna;
    delete zmienna;
    delete [] tablica;

    cout<<"\nCo się stanie po skasowaniu ? \n";
    wypelnij(tablica, n, *zmienna); //dlaczego wypisuje normalnie tablice?

    return 0;
}

i co mnie zdziwiło po skasowaniu tablicy dynamicznej nadal ją wyświetliło w przeciwieństwie do zmiennej która przyjęła wartość 0
dlaczego tak się dzieje ?

1

Bo wypelnij() przy drugim wywołaniu maże po pamięci nadpisując nie przydzielony obszar.
Oddziel wypełnienie od wyświetlenia.

0

ja myślałem że polecenie delete kasuje trwale zmienną tzn że po skasowani nie można się do niej już odołać-odwołanie spowoduje błąd

zrobiłem tak jak mówisz ale teraz to wygląda jakby kasowało tylko 1 pozycje t[0], na t[1] przyjmuje wartość dla t[0] a potem leci normalnie

#include <iostream>
using namespace std;

void wyswietl(int t[], int n, int zmienna)
{
    for (int i=0; i<n; i++)
        cout<<t[i]<<", ";
    cout<<"\nZmienna dynamiczna= " << zmienna;
}
void wypelnij(int t[], int n)
{
    for (int i=0; i<n; i++)
        t[i]=i;
}

int main()
{
    int *tablica, *zmienna;
    int n;
    char a;
    zmienna = new int;
    cout<<"Podaj zmienną dynamiczną: ";
    cin>>*zmienna;
    cout<<"\nPodaj wielkość tablicy: ";
    cin>>n;
    tablica = new int[n];
    cout<<"Chcesz wypełnić tablice ?(t/n): ";
    cin>> a;
    if (a=='t')
    {
        wypelnij(tablica, n);
        wyswietl(tablica, n, *zmienna);
    }
    else
        cout<<"\nZmienna dynamiczna =  "<<*zmienna;
    delete zmienna;
    delete [] tablica;

    cout<<"\nCo się stanie po skasowaniu ? \n";
    wyswietl(tablica, n, *zmienna);

    return 0;
} 
0

Może spowodować. Ale jak nie spowoduje tym razem to następnym razem może spowodować (w tym samym kodzie w tym samym miejscu).

Zwalnia ta pamięć oraz używa ją do czegoś innego albo i nie. To że teraz użyło tylko pierwszy element o niczym nie świadczy.

0

aaa rozumie czyli po prostu choć znajduje się w pamięci to to miejsce jest przeznaczone do ponownego użytku a te dane bd tam siedzieć dopóki program jej nie użyje na nowo tak ? ;)

2

Z grubsza - tak.
Nie wdawaj się w to co się dzieje z tą pamięcią bo to mocno zależy od kompilatora i systemu operacyjnego.
Cokolwiek z nim się dzieje, zwolniłeś - nie używaj.

1 użytkowników online, w tym zalogowanych: 0, gości: 1