Witam
Piszę sobie (w ramach ćwiczeń) programik, w którym jest przeładowany operator new.
Operator ten przy tworzeniu pierwszego obiektu tej klasy rezerwuje od razu pamięć na 100 takich obiektów:
void * Obiekt::operator new(size_t rozmiar)
{
// inne operacje
poczatek = new char[rozmiar * 100];
// inne operacje
return poczatek;
// inne operacje
}
poczatek jest statycznym wskaźnikiem do void i cały czas wskazuje na początek tej stu elementowej tablicy.
Przy tworzeniu kolejnych obiektów tej klasy operator ten zwraca po prostu adres z tego wcześniej zarezerwowanego obszaru.
Mam też przeładowany operator delete, który przy skasowaniu ostatniego obiektu tej klasy powinien zwrócić zarezerwowaną pamięć na te 100 obiektów. No i tu moje pytanie:
Jak mam zwolnić tę pamięć:
1:if(ile_obiektow == 0)
{
delete poczatek;
}
2:<code>if(ile_obiektow == 0)
{
delete [] poczatek;
}
3:
if(ile_obiektow == 0)
{
void * usuwany = poczatek;
for(int i = 0; i < 100; i++)
{
delete usuwany;
Obiekt * tmp = reinterpret_cast<Obiekt *>(usuwany);
tmp++;
usuwany = tmp;
}
}
Wydaje mi się, że opcja 3 jest na pewno poprawna, ale nie wiem czy opcja 2 nie zrobi tego samego szybciej ;)
Która opcja jest poprawna i dlaczego?