Dynamiczna alokacja tablicy - jak sprawdzić ile zaalokowałem miejsca?

0

Jest takie coś

Int tab [10];
Int * tab2;

Sizeof (tab) pokazuje 40

Ale jak dam

Tab2 = new int [10]

to sizeof (tab2) pokazuje 8

Dlaczego tak jest skoro nazwa tablicy to tez adres.
I jak mam sprawdzić ile zaalokowałem miejsca

Sizeof (tab2)/sizeof (int) raczej sie nie sprawdzi

dodanie znaczników <code class="cpp"> i `` + poprawienie tytułu wątku - fp

2

Nazwa tablicy to NIE JEST jej adres, lecz może automagicznie na niego się skonwertować.
Rozmiaru tablicy przydzielonej za pomocą new nie da się odzyskać w żaden sensowny sposób (w bezsensowny sposób - da się).
sizeof od wskaźnika zwraca rozmiar wskaźnika.

1

A jaki jest ten bezsensowny sposòb?

3

Grzebanie po pamięci i znacznikach allocatora.

2

Bezsensowny sposób == dłubanie w internalsach heapu lub kodu generowanego przez kompilator. Fajne jak się pisze exploit albo PoC, ale sugerowałbym nie używać takich sztuczek w innym kodzie :)

Więc jak alokujesz tablicę via new, to musisz jej wielkość "nosić razem z pointerem" :)
Ew po prostu używaj std::vector<>, który ma swój .size() czy tam .length().

0

a skąd mam wiedzieć że zaalokował ją dobrze skoro nie moge sprawdzić rozmiaru takiej tablicy

4

Standardowo new wyrzuca wyjątek std::bad_alloc jeżeli alokacja się nie powiedzie. Jest możliwość ustalenia za pomocą std::set_new_handler funkcji, która ma zostać wywołana jeżeli alokacja za pomocą new się nie powiedzie. Taka funkcja może zrobić coś innego, niż wyrzucenie wyjątku.

Można też powiedzieć new, że ma nie rzucać wyjątku: służy do tego std::nothrow. W takim wypadku podczas błędu alokacji zwracany jest nullptr. (Podobnie, jak robi to malloc)

1 użytkowników online, w tym zalogowanych: 0, gości: 1