Tablica wskaźników a wskaźnik do tablicy

0

Zapytam nieśmiało o coś podstawowego. Jaka jest różnica między:

int* tablica[10];

a

int * tablica = new int[10];

To pierwsze to tablica wskaźników, a to drugie?

1

to drugie to dynamiczna tablica jednowymiarowa, która ma 10 elementów,

0

Więc jeśli napiszę:

int* tablica[10];
for (int i = 0; i < 10; i++) tablica[i] = new int;

to potem pamiętać o zwolnieniu pamięci tak:

for (int i = 0; i < 10; i++) delete tablica[i];

A czy tak mam zwolnić pamięć tej drugiej?

delete [] tablica;
0

Pierwsze to dziesięcioelementowa tablica wskaźników, które wskazują na jakiś losowy obszar pamięci.

Drugie to wskaźnik (jeden), który jest ustawiony na pierwszy element, dziesięcioelementowej tablicy zaalokowanej na stercie, czyli dynamiczna alokacja (jeśli sam później tej pamięci nie zwolnisz to będzie wyciek).

Odnośnie Twojego drugiego posta to tak i tak.

0

Kompilator nie protestuje, gdy napiszę:

delete tablica;

zamiast:

delete [] tablica;

To co ja wtedy zwalniam? Pierwszy element tablicy dynamicznej?

0
didzni napisał(a):

Kompilator nie protestuje, gdy napiszę:

delete tablica;

zamiast:

delete [] tablica;

To co ja wtedy zwalniam? Pierwszy element tablicy dynamicznej?

To jest niezdefiniowane zachowanie.

0

To co ja wtedy zwalniam? Pierwszy element tablicy dynamicznej?

Raczej zwolni całą tablicę ale destruktor uruchomi jedynie dla pierwszego elementu.

0

Kompilator nie protestuje, ale to UB. Ogółem zamiast marnować czas na new i delete - nie używaj ich. https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

0

Dziękuję wszystkim za informacje.

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