Wielkość tablicy na stercie

0

Załóżmy, że jest taki kod:

void ProgramGlowny()
{
    int* Tablica;
    int WielkoscTablicy;
    scanf(WielkoscTablicy);
    Tablica = new int[WielkoscTablicy];
    ProceduraWykonawcza(Tablica);
    delete[] Tablica;
}

void ProceduraWykonawcza(int *X)
{
    int WielkoscTablicy = ????;
    for(int I = 0; I < WielkoscTablicy; I++)
    {
        X[I] = I;
    }
}

W skrócie mówiąc, użytkownik podaje wielkość tablicy, a ona jest potem zapełniana kolejnymi liczbami.

Czytałem, że w tablicach na stercie nie da się wprost odczytać jej wielkości, tylko trzeba mieć dodatkową zmienną, która zawiera wielkość tablicy, ewentualnie pierwszy element może ją mieć lub ostatni element będzie mieć wartość charakterystyczną.

Z drugiej strony, musi gdzieś istnieć informacja o jej wielkości, żeby funkcja delete[] wiedziała, odkąd dokąd ma zwolnić pamięć.

Czy jest jakiś sposób na uzyskanie wielkości tablicy? Czy przy funkcjach działających na takich strukturach trzeba osobno podawać jej wielkość? Skąd delete[] wie, ile bajtów po wskazanym adresie ma uznać za uwolnione?

0
...
size_t WielkoscTablicy;
...
    Tablica=new int[WielkoscTablicy];
    ProceduraWykonawcza(Tablica,WielkoscTablicy);
    delete[] Tablica;
...
void ProceduraWykonawcza(int *Tablica,size_t Rozmiar)
...
0

jak jesteś taki ciekawy jak implementuje kompilator zwalnianie pamięci delete to zdissassembluj ten program np gdb. Jednak nie wiem po co by ci ta wiedza była potrzebna. To jest sprawa kompilatora a nie programisty

0
_13th_Dragon napisał(a):
...
size_t WielkoscTablicy;
...
    Tablica=new int[WielkoscTablicy];
    ProceduraWykonawcza(Tablica,WielkoscTablicy);
    delete[] Tablica;
...
void ProceduraWykonawcza(int *Tablica,size_t Rozmiar)
...

Właśnie taki sposób stosowałem do tej pory, czyli osobne podanie wielkości tablicy.

robcio napisał(a):

jak jesteś taki ciekawy jak implementuje kompilator zwalnianie pamięci delete to zdissassembluj ten program np gdb. Jednak nie wiem po co by ci ta wiedza była potrzebna. To jest sprawa kompilatora a nie programisty

Nie interesują mnie szczegóły budowy kompilatora, interesuje mnie, czy tablica na stercie w standardowym języku C++ posiada informację o wielkości, podobnie, jak w językach Java i C#.

0

interesuje mnie, czy tablica na stercie w standardowym języku C++ posiada informację o wielkości

Tablica - nie. To "coś" co odpowiada za zarządzenie pamięcią - tak (a przynajmniej wie, ile zostało zaalokowane i ile należy zwolnić, to nie zawsze musi być tożsame z rozmiarem tablicy).

Używaj std::vector to przestaniesz mieć takie dziwne problemy.

0

albo (z C++0x) array

0

Niedoczytanie.. nieważne

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