Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Kasowanie z pamięci struktur mając wskaźnik na ich tablice

Ostatnio zmodyfikowano 2014-10-17 13:59
Autor Wiadomość
b0r0
Temat założony przez niniejszego użytkownika
[C++] Kasowanie z pamięci struktur mając wskaźnik na ich tablice
» 2014-10-16 23:04:29
Zakładałem poprzednio temat z tym samym programem ale tym razem przeniosłem się na C++ (o niebo łatwiej).

Małe objaśnienie funkcja losowanie miała dynamicznie alokować pamięć na tablicę N wskaźników na struktury, wprowadzić dane i na końcu zwrócić adres tablicy.
Funkcja kasowanie miała wczytać wskaźnik na tablice struktur (co chyba jeszcze robi) i tu zaczyna się zabawa, "zwalniana jest najpierw kolejno pamięć zajęta przez wszystkie przechowywane struktury" "następnie zwalniana jest również pamięć zajęta przez samą tablicę."  z czego udało mi się jak na razie zwolnić pamięć zajętą przez tablice

C/C++
#include <iostream>
#include <cstdio>
#include <time.h>
#include <stdlib.h>
#include <cstdlib>
using namespace std;

struct Struktura
{
    int a;
    char b;
    double c;
};

Struktura * losowanie( int N )
{
    Struktura * tab;
    tab = new Struktura[ N ];
   
    for( int i = 0; i < N; i++ )
    {
        ( tab + i )->a =( rand() % 1000001 );
        ( tab + i )->b =( rand() & 24 ) + 65;
        ( tab + i )->c = 0;
    }
   
    for( int i = 0; i < N; i++ )
    {
        cout <<( tab + i )->a << endl;
        cout <<( tab + i )->b << endl;
        cout <<( tab + i )->c << endl;
    }
    cout << tab + 0 << endl;
    cout << tab + 1 << endl;
    cout << tab + 2 << endl;
    cout << endl;
    return tab;
}

void kasowanie( Struktura * adres, int N )
{
    cout << adres << endl;
    for( int i = 0; i < N; i++ )
    {
        delete(( *( adres ) ) + i );
        //delete (adres+i);
        //delete (adres+i);
    }
    //delete[] adres;
}

void sortowanie( Struktura * adres, int N )
{
   
}

int main()
{
    int N = 3;
    Struktura * adres;
   
    clock_t begin, end; ///inicjajca czasomierza
    double time_spent;
    begin = clock();
   
    adres = losowanie( N );
    cout << adres << endl;
    kasowanie( adres, N );
   
    end = clock();
    time_spent =( double )( end - begin ) / CLOCKS_PER_SEC; //koniec pomiaru czasu
   
}
P-118657
michal11
» 2014-10-17 00:26:44
Ale ty robisz przecież zwykłą tablicę. Wystarczy w funkcji kasowanie
delete[] adres;
.

Jeżeli natomiast chcesz zrobić tablice 2 wymiarową, to wyglądało by to mniej więcej tak:
C/C++
int ** create2D( int sizeX, int sizeY )
{
    int ** tab = new int *[ sizeX ];
    for( int i = 0; i < sizeY; ++i )
    {
        tab[ i ] = new int( /*jakas wartość*/ );
    }
    return tab;
}

void delete2D( int ** tab, int sizeX, int sizeY )
{
    for( int i = 0; i < sizeX; ++i )
    {
        delete[] tab[ i ];
    }
    delete[] tab;
}
P-118661
b0r0
Temat założony przez niniejszego użytkownika
» 2014-10-17 00:51:39
Czyli nie tak jak w zwykłym C że trzeba oddzielnie kasować jedno i drugie?

A co do tablicy 2D to nie. Ma być tylko jeden wymiar wczytany

Oryginalna treść:

pobiera jako argument liczbę N struktur, które mają zostać utworzone;
o dynamicznie alokuje pamięć na tablicę N wskaźników na struktury;
o następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek utworzonej wcześniej tablicy;
o pole typu int (32 bity) jest ustawiane na wartość losową pomiędzy 0 a 1 000 000; pole typu char jest ustawiane na losową literę z zakresu A-Z; a pole typu double jest ustawiane na 0;
o funkcja zwraca adres tablicy.

Najchętniej bym to obszedł i do funkcji wysyłał wskaźnik i rozmiar i w niej wszystko zdefiniował mniej wiecej tak:

C/C++
int main()
{
    Osoba * wskOsoba;
    create_n_place( wskOsoba, il );
}

void create_n_place( Osoba *& wskOsoba, int ile ) ///
{
    wskOsoba = new Osoba[ ile ];
}

P-118662
1aam2am1
» 2014-10-17 13:59:13
Masz wskaźnik.
Alokujesz tablicę wskaźników.
Alokujesz do każdago wskaźnika Strukturę
Tak zrozumiałem z treści zadania. A to co u was widzę to złomowanie od razu tablicy Struktur. Chyba że źle rozumiem zadanie?
P-118676
« 1 »
  Strona 1 z 1