Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Dynamiczna alokacja pamięci.

onlymet 24 Sty 2005 20:57 2870 8
  • #1 24 Sty 2005 20:57
    onlymet
    Poziom 10  

    wie ktos moze jak w Dev-C++ albo Visual MS C++ mozna stworzyc dynamiczna np. tablice??

    w BC 3.11 zwykle robilem to z procedur dostepnych w bibliotece alloc.h;
    np.

    Code:
    int *aaa;
    
    aaa = callock(ile, sizeof(int));
    ...
    free (aaa);

    lub
    Code:
    int *aaa;
    
    aaa = mallock (ile*sizeof(int));
    ...
    free (aaa);


    niestety te dwa kompilatory (Dev-C++ 4.9.8.5. albo Visual MS C++ 6.0) do ktorych uzywania jestem zmuszony nie chca wspolpracowac z ta biblioteka (alloc.h).

    z gory dzieki za pomoc

    Zamykam. - arnoldziq

  • #2 24 Sty 2005 21:03
    adames80
    Poziom 18  

    int * aaa = new int[ilosc komorek]

  • #3 24 Sty 2005 21:04
    onlymet
    Poziom 10  

    wie ktos moze jak w Dev-C++ albo Visual MS C++ mozna stworzyc dynamiczna np. tablice??

    w BC 3.11 zwykle robilem to z procedur dostepnych w bibliotece alloc.h;
    np.

    Code:
    int *aaa;
    
    aaa = calloc (ROZMIAR, sizeof(int));
    ...
    free (aaa);

    lub
    Code:
    int *aaa;
    
    aaa = malloc (ROZMIAR*sizeof(int));
    ...
    free (aaa);


    niestety te dwa kompilatory (Dev-C++ 4.9.8.5. albo Visual MS C++ 6.0) do ktorych uzywania jestem zmuszony nie chca wspolpracowac z ta biblioteka (alloc.h).

    wiem ze mozna tez taka tablice stworzyc za pomoca new i delete:

    Code:
    int *aaa;
    
    aaa = new int[ROZMIAR];
    ...
    delete []aaa;

    tyle, ze delete []aaa nie dziala a nie wiem czy wpisanie delete aaa zwalnia cala alokowana pamiec

    z gory dzieki za pomoc

  • #4 24 Sty 2005 21:09
    adames80
    Poziom 18  

    delete aaa usuwa wskaznik wraz z obiektem

  • #5 24 Sty 2005 21:38
    onlymet
    Poziom 10  

    dzieki

    P.S. prapraszam za powtorzenie tematu cos IE mi szwankuje

  • #6 24 Sty 2005 22:48
    h-doc
    Poziom 27  

    malloc() siedzi w stdlib.h i na pewno działa, bo sam korzystaj z tej funkcji w MSVC++

  • #7 25 Sty 2005 13:38
    MARIO159
    Poziom 11  

    a mi sie zdaje ze
    delete aaa;
    usunie tylko pierwszy obiekt tablicy
    żeby usunąc cała tablice trzeba użyć
    delete aaaa[];
    wtedy usunie sie całą tablice z pamięci
    tak mi sie zdaje:)

  • #8 26 Sty 2005 03:16
    shg
    Specjalista techniki cyfrowej

    Zobacz, w których bibliotekach masz zdefiniowane funkcje malloc(), calloc() i free(), bo może one są obecne w tych kompilatorach, tylko gdzie indziej. U mnie (Amiga) w jednym kompilatorze (DICE) te funkcje siedzą w stdlib.h, a w drugim (vbcc) w memory.h.
    Zresztą to są funkcje standardowe, gdzieś być muszą, tylko kwestia gdzie...

  • #9 27 Sty 2005 12:14
    Bielsky
    Poziom 20  

    MARIO159 napisał:
    a mi się zdaje ze
    delete aaa;
    usunie tylko pierwszy obiekt tablicy
    żeby usunąc cała tablice trzeba użyć
    delete aaaa[];
    wtedy usunie się całą tablice z pamięci
    tak mi się zdaje:)


    W tym przypadku - jeżeli new utworzyło całą to i delete usunie całą (stworzyliśmy jeden obiekt zawierający kilka elementów a nie kilka pojedynczych).

    Jeśli idzie o konstrukcje typu malloc - używanie ich jest w c++ możliwe, ale niepotrzebnie komplikuje życie. New i delete automatycznie troszczą się o parę rzeczy o których trzeba pamiętać przy użyciu malloc.
    Tworzenie zmiennych za pomocą malloc jest właściwe dla c.

    W c++ możemy korzystać z tzw. kontenerów, które mają pewne cechy tablicy dynamicznej i są bardzo wygodne w stosowaniu. Jednym z nich jest vector:
    Code:
    #include <iostream>
    
    #include <stdlib.h>
    #include <vector>

    using namespace std;

    int main(int argc, char *argv[])
    {
       //tak deklarujemy wektor:
        vector<int> a;
        //zamiast int można podać dowolny typ, również własną klasę

       //zapisujemy do wektora kolejne elementy:
       //np. konkretną wartość   
       a.push_back(1);
       //albo zmienną:
        int b=31;
        a.push_back(b);
        b=8;
        a.push_back(b);
       
       //wypisujemy na ekran
       cout << a[0] << endl
           << a[1] << endl
           << a[2] << endl;   
       
       //zmieniamy wartości elementów wektora:
        a[0]=0;
        a[1]=3*5+12+a[2];
        a[2]=2;
        
        //w każdej chwili możemy dorzucić następny element:
         a.push_back(a[0]+a[1]+a[2]-7);
       
       //aby automatycznie odczytać/wypisać wszystkie elementy
       //niezaqleżnie od tego, ile ich jest
        //posłużymy się tzw. iteratorem:
       vector<int>::iterator i;
       //iterator to rodzaj wskaźnika na element wektora

       //wypisujemy na ekran nowe wartości elementów wektora
       cout << "nowe wartości elementów\n";
         for (i=a.begin();i!=a.end();i++) cout << *i << endl;      
         //Proste, prawda?

         //praktyczna uwaga:
          //gdyby utworzyć wektor zawierający wskaźniki do zmiennych, np:
        vector<char *> tab;
        //należy na koniec wykasować obiekty na które wskazują
          vector<char *>::iterator j;
        //(chyba, że wskażniki te są przechowywane jeszcze gdzie indziej i mają być wykorzystane)
          for (j=tab.begin();j!=tab.end();j++) delete *j;
          
       system("PAUSE");   
       return 0;
    }

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME