Dynamiczne przydzielanie pamięci - operator new [problem ze zrozumieniem]
Ostatnio zmodyfikowano 2015-05-12 11:26
carlosmay |
» 2015-05-10 20:07:27 Można zrobić to tak: Ten kod jest błędny. |
U mnie działa ten kod. Przykład książkowy. Oto cały kod: #include <iostream> using namespace std;
int * zwiekszTab( int * w_wartosci, int * rozmiar ); void drukujTablice( int * w_wartosci, int rozmiar, int zajete_pola );
int main() { int nastepny_element = 0; int rozmiar = 10; int * w_wartosci = new int[ rozmiar ]; int wart; cout << "Podaj liczbe: "; cin >> wart; while( wart > 0 ) { if( rozmiar == nastepny_element + 1 ) { w_wartosci = zwiekszTab( w_wartosci, & rozmiar ); } w_wartosci[ nastepny_element ] = wart; nastepny_element++; cout << "Oto bierzace parametry tablicy: " << endl; drukujTablice( w_wartosci, rozmiar, nastepny_element ); cout << "Podaj liczbe (0 - wyjscie z programu): "; cin >> wart; } delete[] w_wartosci; system( "pause" ); }
void drukujTablice( int * w_wartosci, int rozmiar, int zajete_pola ) { cout << "Calkowity rozmiar tablicy: \t" << rozmiar << endl; cout << "Liczba zajetych pol tablicy: \t" << zajete_pola << endl; cout << "Wartosci w tablicy: \n\n"; for( int i = 0; i < zajete_pola; ++i ) { cout << "w_wartosci[" << i << "] = " << w_wartosci[ i ] << endl; } }
int * zwiekszTab( int * w_wartosci, int * rozmiar ) { * rozmiar *= 2; int * w_nowe_wartosci = new int[ * rozmiar ]; for( int i = 0; i < * rozmiar; ++i ) { w_nowe_wartosci[ i ] = w_wartosci[ i ]; } delete[] w_wartosci; return w_nowe_wartosci; }
|
|
pekfos |
» 2015-05-10 20:32:49 Przekraczasz zakres tablicy. Kopiujesz 2n elementów z n-elementowej tablicy. |
|
Piastlis |
» 2015-05-10 20:49:14 Ale to są pierdoły...Kolega zapytał się po co jest ta konstrukcja z NEW I DELETE. I w kilku postach wyszło że można więcej niż na konstrukcjach statycznych.Kolega pekfos zamiast opowiadać czy jakichś kod da lub nie da się skompilować niech da jakikolwiek konstruktywny przykład. |
|
DejaVu |
» 2015-05-11 23:20:23 Stos jest obszarem pamięci, który jest wykorzystywany przede wszystkim do tego, aby zapewnić możliwość wywoływania metod i funkcji w kodzie oraz do tego, aby dało się przekazywać do nich wartości. To, że da się również na stosie tworzyć zmienne jest poniekąd cechą dodatkową, którą początkujący programiści nadużywają. Rozmiar stosu jest określany z chwilą uruchomienia aplikacji i zazwyczaj wynosi on kilka MB. Jak się tą pamięć wyczerpie to aplikacja się wysypie. Tym samym na stosie nie należy trzymać dużych zbiorów danych, tylko trzymać wskaźniki na dane umieszczone na stercie.
Sterta to obszar pamięci zarządzany przez system operacyjny z którego możesz otrzymać do 2GB pamięci dla aplikacji 32-bitowych, oraz powyżej 2GB dla aplikacji 64-bitowych. Dostęp do pamięci na stercie uzyskujesz poprzez operatory new/delete lub funkcje typu malloc/free.
Tablice na stosie muszą mieć rozmiar stały, czyli ich rozmiar musi być znany w chwili kompilacji programu. Stąd jeżeli tworzysz sobie program, który wczytuje dane musisz: - albo utworzyć tablicę na stosie o z góry maksymalnym rozmiarze, poświęcając jednocześnie kluczową pamięć patrząc z punktu widzenia funkcjonowania aplikacji; - albo utworzyć tablicę dynamicznie dla której możesz albo z góry określić maksymalny rozmiar tablicy znany podczas kompilacji, albo pozwolić użytkownikowi określić maksymalny rozmiar tablicy, a następnie zaalokować tablicę o oczekiwanym rozmiarze.
Tworzenie zmiennych na stosie nie jest złe, ponieważ ich utworzenie (jak i zwolnienie) jest znacznie szybsze niż utworzenie zmiennej na stercie (zwalnianie pamięci sterty również trwa dłużej). Stos jest jednak bardzo mały w porównaniu ze stertą i dlatego należy w miarę rozsądnie podchodzić do tworzenia dużych tablic na stosie, bo jest to pamięć krytyczna, zapewniająca poprawną pracę aplikacji. |
|
Dreux Temat założony przez niniejszego użytkownika |
» 2015-05-12 11:26:01 Dziękuję. Już mniej więcej rozumiem to i owo :) |
|
1 « 2 » |