
#programowanie #cpp
Skąd operator delete wie ile ma uwolnić pamięci?
-----
wirtualne konstruktory działają fajnie. Na początku zakładałem, ze delete rozmiar czerpie z przekazanego pointera. Ale powyższy przykład burzy tę teorię. Gdzieś musi być trzymany rozmiar, aby poprawnie kod zadziałał. Gdzie? vtables, czy może gdzieś przy kodzie destruktora?
Skąd operator delete wie ile ma uwolnić pamięci?
class A {
public:
virtual ~A();
int a;
}
class B: public A {
public:
int b;
}-----
A* aPtr = new B;
delete aPtr;wirtualne konstruktory działają fajnie. Na początku zakładałem, ze delete rozmiar czerpie z przekazanego pointera. Ale powyższy przykład burzy tę teorię. Gdzieś musi być trzymany rozmiar, aby poprawnie kod zadziałał. Gdzie? vtables, czy może gdzieś przy kodzie destruktora?
- Najlepsze
- Wszystkie komentarze







@msgreen: dokladnie tak jest, glowy nie dam, ale pierwsze 4 bajty to zdaje sie rozmiar obiektu
oraz dla tablic:
http://stackoverflow.com/questions/2327848/how-does-the-delete-in-c-know-how-many-memory-locations-to-delete
Wygląda na to, że każdy kompilator robi to po swojemu, że jest to kwestia implementacji kompilatora. Zwykle rozmiar zaalokowanej pamięci jest gdzieś zapisywany, a w pierwszym linku są dwa tego przykłady.
Komentarz usunięty przez autora Wpisu
Komentarz usunięty przez autora Wpisu
Za to destruktor to zwyczajna funkcja, jeśli jest wirtualny to po prostu (to juƶ kwestia implementacji, standard nie nakazuje takiej) jego adres jest jednym z adresów w vtable, więc nie ma problemów z wywołaniem destruktora dla dynamicznego typu pod wskaźnikiem.
@trzeci:
@vipe: dobry materiał, dzięki za najdokładniejsza odpowiedź
Komentarz usunięty przez autora Wpisu
Komentarz usunięty przez autora