[C++] Struktury i ich kasowanie

qwerz
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 16 sty 2016, o 19:20
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 11 razy

[C++] Struktury i ich kasowanie

Post autor: qwerz »

Dzień dobry!

Muszę napisać program, w którym zdefiniuję jedną strukturę zawierającą trzy zmienne. Następnie muszę napisać funkcję, której argumentem będzie liczba n struktur, które mają zostać utworzone. Funkcja ta ma także alokować dynamicznie pamięć pod tablicę n wskaźników na struktury, a potem alokować kolejno n struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy. Zmienne w utworzonych strukturach mają mieć losowo przypisane wartości z pewnych zakresów. Na końcu funkcja ma zwrócić adres tablicy.

Druga funkcja służąca do kasowania powinna pobierać wskaźnik na tablicę struktur oraz jej wielkość, później zwalniać pamięć zajętą przez struktury, a potem zwalniać pamięć zajętą przez tablicę wskaźników.

Napisałam coś takiego:

Kod: Zaznacz cały

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

struct Structure
{
    int a;
    int b;
    int c;
};

Structure **create(int n)
{
    Structure **arr;

    //alokowanie
    arr = new Structure*[n];
    for(int i =0; i<n; i++)
    {
        arr[i]=new Structure;
    }

    //przypisywanie losowych liczb do kolejnych zmiennych
    for(int i=0; i<n; i++)
    {
        arr[i]->a = (1 + rand() % 101);
        arr[i]->b = (1 + rand() % 101);
        arr[i]->c = (1 + rand() % 101);
    }

    //wyswietlanie
    for(int i=0; i<n; i++)
    {
        cout << arr[i]->a << endl;
        cout << arr[i]->b << endl;
        cout << arr[i]->c << endl;
    }

    return arr;
}

void del(Structure **str, int n)
{
    for(int i =0; i<n; i++)
        delete str[i];

    delete [] str;
    str=NULL;
}

int main()
{
    srand(time(0));
    int s = 5;
    Structure **str;
    str = create(s);
    del(str, s);
    return 0;
}
Pytanie, czy to jest napisane poprawnie?
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Struktury i ich kasowanie

Post autor: kalwi »

Jest ok.
qwerz
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 16 sty 2016, o 19:20
Płeć: Kobieta
Lokalizacja: Polska
Podziękował: 11 razy

[C++] Struktury i ich kasowanie

Post autor: qwerz »

kalwi pisze:Jest ok, aczkolwiek zmień materiały z których się uczysz na nowsze.
Dzięki. A jakie dokładnie innowacje powinny się znaleźć w moim kodzie?

I właśnie odkryłam, że chyba nie do końca jest ok, bo gdy dodaję w mainie za funkcją del takie wypisywanie:

Kod: Zaznacz cały

cout << str[0]->pole1 <<endl;
cout << str[1]->pole1 <<endl;
cout << str[2]->pole1 <<endl;
cout << str[3]->pole1 <<endl;
cout << str[4]->pole1 <<endl;
to tylko dwie pierwsze wartości się kasują, a pozostałe mają wylosowane wcześniej wartości.
kalwi
Użytkownik
Użytkownik
Posty: 1931
Rejestracja: 29 maja 2009, o 11:58
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 145 razy
Pomógł: 320 razy

[C++] Struktury i ich kasowanie

Post autor: kalwi »

time.h -> ctime

NULL -> nullptr

Co do wartości wyświetlonych - powodujesz UB w ten sposób, więc nie ma co się dziwić. Na innym kompilatorze równie dobrze mogłyby być wszystkie wartości oryginalne albo i wszystkie zmienione. Jak chcesz sprawdzić czy masz wyciek pamięci czy nie - skorzystaj z narzędzia zwanego Valgrind
ODPOWIEDZ