• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

po co alokowanie pamięci new delete

Object Storage Arubacloud
0 głosów
968 wizyt
pytanie zadane 29 maja 2016 w C i C++ przez 1naswiecie Początkujący (410 p.)
Witam, jestem początkujący, i chciałbym aby ktoś odpowiedział mi na pytanie, po co  alokowanie pamięci new delete ??

Rozumiem że jeśli stworze jakąś zmienna o jakiejs wartosci mogę wskaznikiem przez adres zmiennej dostać się do jej wartości . Do czego słuzy alokowanie pamięci skoro tworząc zwyka zmienną, ta zmienna automatycznie zapisuje się w jakimś obszarze pamięci , tak samo tablicę jesli stworzę tablicę operatora new taka tablica również znajdzie automatycznie miejsce w pamięci.

 

Proszę o wytłumaczenie po co alokujemy pamięć wykorzystując operatory new delete.

3 odpowiedzi

+5 głosów
odpowiedź 29 maja 2016 przez Szahid Pasjonat (20,930 p.)
wybrane 29 maja 2016 przez 1naswiecie
 
Najlepsza
Operator new pozwala na zaalokowanie pamięci podczas trwania programu. Np kiedy chcesz żeby użytkownik wprowadził jakąś ilość danych to zamiast tworzyć tablice 1000000000 elementową licząc na to że ta ilość danych się tam zmieści to pytasz się użytkownika ile danych chce wprowadzić i za pomocą new tworzysz określoną ilość zmiennych Dzięki temu oszczędzasz pamięć bo nie tworzysz zmiennych które nie będą używane. Chcesz przykładowy kod dla zobeazowania tego?
komentarz 29 maja 2016 przez 1naswiecie Początkujący (410 p.)
No tak, jesli chce zaalokować jakąś tablice w pamięci to i tak muszę napisać ile elementów ma posiadać.

np. int *przyklad = new int [10]

pamiec zostanie zaalakowana na 10 elementow?

tak poprosze o przykladowy kod i dziekuje za odpowiedz :)
komentarz 29 maja 2016 przez 1naswiecie Początkujący (410 p.)
OK przeczytalem twój post 10 razy i chyba skumałem :)

Ale jak mozesz wyslij przykładowy kod :)
1
komentarz 29 maja 2016 przez Szahid Pasjonat (20,930 p.)

Jeśli tworzysz tablice normalnie czyli  po prostu piszesz  np   int tab[10] to z góry zakładasz ile ona ma mieć elementów 

Tworząc tablice w ten sposób w nawiasy kwadratowe musisz  wpisać jakąś stałą. 

Jeśli ilość elementów ma zostać ustalona w trakcie działania programu NIE MOŻESZ zrobić tak - 

#include <iostream>


using namespace std;

int main()
{
    cout << "ile elementow ma miec tablica?" << endl;


int ile;
cin>>ile;
int tab [ile];



    return 0;
}

Dlaczego nie możesz tak zrobić ? Bo zmienna ile nie ma określonej wartości przed rozpoczęciem programu.  ( program nie będzie działał) 

 

Jednak kiedy chcesz stworzyć tablice nelementową ( n podawane przez użytkownika) to korzystasz z new 

POPRAWNY przykład działającego programu -

#include <iostream>


using namespace std;

int main()
{
    cout << "ile elementow ma miec tablica?" << endl;


int ile;
cin>>ile;
int* tab=new int[ile];



    return 0;
}

 

komentarz 29 maja 2016 przez 1naswiecie Początkujący (410 p.)
dzieki!! :)
komentarz 29 maja 2016 przez niezalogowany
Ten "poprawny" przykład ma wyciek pamięci. Ciekawostka: w C++17 ma zostać wprowadzone VLA(Variable Length Array), czyli pierwszy przykład będzie poprawny.
komentarz 29 maja 2016 przez Szahid Pasjonat (20,930 p.)
Pierwsze słysze o cpp17. Wydawało mi się że jeszcze cpp11 jest dopracowywane ale nie siedze w tym tak żeby się sprzeczać. Mógłbyś rozwinąć to o tym wycieku? Chodzi Ci o delete ?
1
komentarz 29 maja 2016 przez Szahid Pasjonat (20,930 p.)

Nie ma sprawy. 

 

Dodam jeszcze że dobrą praktyką jest napisanie  na koniec delete[] tab żeby zwolnić pamięć po zaalokowani tej tablicy. W takim prostym programie i tak to nie ma znaczenia ponieważ po zakończeniu programu wszystko się zwalnia jednak gdy będziesz pisał programy zkładające się z kilku funkcji to sytuacja się odmieni ponieważ zmienne zaalokowane dynamicznie cały czas " żyją" po zakończeniu się funkcji ( w przeciwieństwie do automatycznych )

 

Tego podkreślonego nie próbuj ogarnąć bo to złożony temat  i na dalszym etapie nauki dokładnie dowiesz się o co z tym chodzi. 

1
komentarz 29 maja 2016 przez niezalogowany
C++11? To przeszłość. Już od dawna jest C++14, którego kompilatory GCC od wersji 5.0 i Clang od 3.4(ale nie dam sobie ręki uciąć że na pewno od 3.4) w pełni wspierają. A już za rok nowy standard: C++17. Jak chcesz wiedzieć o nowych rzeczach jakie zostaną wprowadzone, zrób mały research  w internecie.

Tak chodziło mi o brak delete.
komentarz 29 maja 2016 przez Szahid Pasjonat (20,930 p.)
Dziękuje. Na pewno się tym zainteresuje.
+3 głosów
odpowiedź 29 maja 2016 przez draghan VIP (106,230 p.)
Nikt dotąd nie napisał o bardzo ważnym czynniku, który jest jednym z powodów stosowania alokacji dynamicznej.

Chodzi o przepełnienie stosu. Wszystkie zmienne, które są statyczne, lądują na stosie. Stos ma ograniczoną pojemność. Proszę spróbować utworzyć statyczną tablicę doubli o sporej (naprawdę sporej) ilości elementów i uruchomić taki program.
W programach dydaktycznych to żaden problem, bo nikt takiej ilości pamięci raczej nie potrzebuje, natomiast w poważnych projektach to całkiem realna do uzyskania sytuacja.

Alokacja dynamiczna powoduje utworzenie takiej tablicy na stercie, która nie jest tak ograniczona, jak stos - więc jest rozwiązaniem problemu.
+1 głos
odpowiedź 29 maja 2016 przez Sinnley Stary wyjadacz (12,810 p.)

Zakładając, że ktoś chce wprowadzić dane do tablicy, i tych elementów będzie MAKSYMALNIE 50 stosując podejście statycznego alokowania zmiennych musiałbyś zaalokować tablicę o rozmiarze 50.
Jeśli zrobisz to dynamicznie będziesz mógł ją zaalokować dokładnie taką, jaką potrzebujesz.

Przykład:

//Opcja pierwsza
cout << "Podaj ile chcesz wprowadzić elementów: ";
int ile;
cin >> ile;
int tab[50]
for(int i=0; i<ile; i++)
   cin >> tab[i];

//Opcja druga

cout << "Podaj ile chcesz wprowadzic elementow: ";
int ile;
cin >> ile;
int * tab = new int[ile];
for(int i=0; i<ile; i++)
   cin >> tab[i]

W pierwszym przypadku zawsze alokujesz 50 * wielkosc inta bajtow pamieci.

W drugim dokladnie tyle ile trzeba.

komentarz 29 maja 2016 przez 1naswiecie Początkujący (410 p.)
Dzieki :)

Podobne pytania

+1 głos
1 odpowiedź 1,482 wizyt
+2 głosów
3 odpowiedzi 2,977 wizyt
0 głosów
1 odpowiedź 633 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...