W normalnych okolicznościach wiem, jak dbać o przydział pamięci. Mój przypadek jest trochę inny.operator delete - jak zaimplementować?
Wdrażam własną pulę pamięci. Chciałbym, aby klient z mojej klasy był tak blisko ogólnej metody alokacji i de alokacji.
inline void* operator new(size_t dead_param, CPool& objPool)
{
return objPool.Allocate();
}
mam tej globalnej funkcji, dzięki czemu użytkownik z mojej klasy może po prostu zadzwonić
Base baseObj = new (poolObj)Base2();
Teraz nie wiem jak wywołać destruktor? clearl nie mam pojęcia
chociaż mam globalny operator delete
inline void operator delete(void* ptr, CPool& objPool)
{
objPool.DeAllocate(ptr);
}
prosimy kierować .. jak mogę dostać tę funkcję o nazwie z kodu klienta? Z minimalnymi zmianami składni ze strony użytkownika. Zauważ też, że nie chcę, aby użytkownicy mojego kodu implementowali operator new
i operator delete
i dzwonili pod numer Allocate
i i .
Dlaczego po prostu nie mają ludzie nazywają 'base * baseObj = poolObj.Allocate();' – Barry
Składnia dla klienta wydaje się trochę brzydka. 'Base * baseObj = (Base *) poolObj.Allocate()'. Yuck ... typecasting ... że chociaż zachowałem się jako ostateczny ośrodek ... Ponieważ nie jestem w stanie uzyskać tej funkcji, jestem teraz chory ... – Adorn
Usunięcie miejsca docelowego jest wywoływane tylko z nowego miejsca docelowego new, gdy konstruktor wychodzi z wyjątek. We wszystkich innych przypadkach wywoływany jest "normalny" operator delete (void *). Powinieneś przechować wystarczającą ilość informacji w przydzielonym bloku pamięci, aby móc później zwolnić, bez dodatkowych danych wejściowych. Często alokator zapisuje dodatkowe informacje w ujemnym przesunięciu względem wskaźnika, który zwraca. –