Obiekty na stercie(operator new)

0

Witam, zanim napisze moje pytanie to rzucę prostym kawałkiem kodu:

 
int main( void )
{
  char* pch = new char [512];
  delete pch;
}
 

Jak wiadomo operatory new oraz delete, to nic innego jak malloc oraz free(), tyle że korzystające dodatkowo z obiektów klasy(konstruktor / destruktor).

Moje pytanie brzmi, czy ktoś z was analizował, gdzie menedżer sterty (pomijam już rodzaj / wersję biblioteki libc, bo menedżery sterty różnie pracują) odkłada adresy obiektów klasy tj. konstruktor lub destruktor?

Drugie pytanie, jak skonstruowana jest struktura na stercie po alokacji operatorem new [] ?
Bo przy użyciu malloc jest wszystko jasne, zwrócony adres to wskaźnik na dane tego bloku, idąc dalej zwrócony adres - 4 bajty = rozmiar przydzielonego bloku, można spokojnie odkopać pola związane z mutex'ami czy też adresy następnego bloku, natomiast kiedy docieram do pamięci po alokacji operatorem New, wszystko jest rozpieprzone, nie potrafie w ogóle tego odczytać, w internecie także niewiele znalazłem na ten temat.. Ktoś mógłby pomóc?

1

Adresy obiektów przechowywane są na stosie ponieważ przechowuje je zwykła, lokalna w Twoim przypadku, zmienna wskaźnikowa. Teraz tylko pytanie o co Ci naprawdę chodzi, bo konstruktory etc to części składowe klasy. Obiekt klasy to co innego niż jego składowa. Czy chodzi o adresy funkcji składowych czy obiektów klasy? :)
A na drugie pytanie być może tutaj znajdziesz odpowiedź: http://stackoverflow.com/questions/1169858/global-memory-management-in-c-in-stack-or-heap

1
keto11 napisał(a):

Witam, zanim napisze moje pytanie to rzucę prostym kawałkiem kodu:

 
int main( void )
{
  char* pch = new char [512];
  delete pch;
}
 

winno być

 delete []pch;

Jak wiadomo operatory new oraz delete, to nic innego jak malloc oraz free(), tyle że korzystające dodatkowo z obiektów klasy(konstruktor / destruktor).

Mogą być ale nie muszą - zależy od implementacji, oraz operatory moga byc przeciążone...

Bo przy użyciu malloc jest wszystko jasne, zwrócony adres to wskaźnik na dane tego bloku, idąc dalej zwrócony adres - 4 bajty = rozmiar przydzielonego bloku,

Niekoniecznie.... Zauważ, że adres może być większy niż 4 bajty, może być też inny sposób przydziału pamięci.

0

Owszem, miało być delete [] pch, kod był pisany tutaj, na szybko w edytorze i racja, jeśli chociażby w 64 bitowym środowisku działa aplikacja, nie musi ten adres mieć 4 bajtów..

Grzesie, dzięki za odpowiedź, chodzi mi o konstruktor oraz destruktor. Czy gdzieś te dwa bratanki są zapisane na stercie, gdzieś jest na nich wskaźnik.

2

Adresy konstruktora i destruktora nie muszą być na starcie, bo są znane na etapie kompilacji lub najdalej linkowania, więc są umieszczane bezpośrednio w kodzie. Mogą też podlegać inline. Wyjątkiem jest wirtualny destruktor - wtedy jego adres jest w vtable, jak każdej innej metody wirtualnej.

0

Tak też właśnie myślałem.. dzięki chłopaki za odpowiedzi!

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