Dynamicznie alokowana pamięć w C++


(Phight3r) #1

Jak to jest z tą dynamiczną alokacją pamięci w C++? Z tego co przeczytałem w kursie chodzi o to że możemy w trakcie działania programu przydzielać sobie pamięć, pracować na niej i potem ją oddać (poprzez delete) i że nie ma ona stałego rozmiaru. Jednak jeśli deklarujemy takie coś:

int* pnZmienna = new int;

to i tak rozmiar takiej pamięci nie będzie przekraczał wielkości typu int. Więc nie mogę zapisać np. takiej liczby: 4897989332847275928284.

Więc jaki jest sens stosowania takich konstrukcji jak za pomocą zwykłych zmiennych osiągnę to samo?


(Sawyer47) #2

Wiadomo, że alokujesz jakiś stały, znany rozmiar, ale może on być obliczony podczas działania programu, a nie zahardkodowany w programie - to właśnie znaczy, że nie ma stałego rozmiaru. Typ int w C++ ma stały (na danej maszynie/kompilatorze) rozmiar, tutaj typ alokacji nie ma żadnego znaczenia. Wreszcie, pamięć nie-dynamiczna dla programu jest ograniczona, nie zaalokujesz zbyt dużo bez dynamicznego przydziału.


(Simon1991) #3

Chociażby taki, że program będzie mniej łakomy na pamięć, ponieważ, jakbyś korzystał tylko ze zwykłych zmiennych, to dla nich wszystkich program musiałby sobie “zabrać” pamięci. Z kolei jak będziesz używał wskaźników, to będziesz mógł zwalniać pamięć poprzez usuwanie niepotrzebnych danych.


(Quentin) #4

Niepotrzebne dane (zmienne automatyczne, czyli zwykłe - bez żadnego przydomka) kompilator też usuwa podczas opuszczania funkcji czy jakiegoś lokalnego bloku.


Nikt normalny nie stosuje takiego alokowania zamiast zwykłych zmiennych. Alokowanie dynamiczne przydaje się wtedy kiedy np.:

:arrow: chcesz stworzyć tablicę o rozmiarze nieznanym jeszcze w compile time,

:arrow: chcesz aby taka zmienna dynamiczna - w przeciwieństwie do zwykłych - “nie przepadała” po opuszczeniu funkcji, bloku lokalnego (kiedy funkcja zwróci jej adres, można na niej normalnie pracować).


(Simon1991) #5

Zgadza się.

Dlaczego uważasz, że nikt normalny nie używa wskaźników i dynamicznego alokowania pamięci? Co wg Ciebie jest złego w tej metodzie?


([alex]) #6

Czy na poważnie pytasz czym jest lepsze:

int x;x=2;coutxendl; [/code]od:
[code=php]int *w=new int;w=2;cout*wendl;delete w; ?