Dynamicznie alokowana pamięć w C++

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?

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.

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.

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ć).

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?

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; ?