Problem z przeciążeniem delete

0

Witam, mam pewien problem z przeciążeniem funkcji operator delete. Mianowicie, według książki "Język C++ Standardy kodowania" (s. 131):

(...) każde przeciążenie w klasie operatora

void* operator new(parametry)

musi być uzupełnione odpowiednim przeciążeniem operatora void operator delete(void*, parametry)

 gdzie parametry to lista typów dodatkowych parametrów (z których pierwszy jest zawsze typu std::size_t). (...)


Czyli jeśli zdefiniuję 
```cpp
void* X::operator new(size_t, int)

to muszę zdefiniować również void X::operator delete(void*, size_t, int)

 Jeśli jednak zrobię tak jak podano, to kompilator wyświetli ostrzeżenie o braku odpowiedniej funkcji operator delete i jeśli z konstruktora wyrzucony zostaje wyjątek, to pamięć nie zostaje zwolniona. Kiedy usunę z listy parametrów funkcji operator delete size_t wszystko działa jak należy. W związku z tym mam więc pytanie: to książka się myli, zmienił się standard w tej kwestii, czy ja po prostu czegoś nie rozumiem?

Z góry dziękuję za odpowiedź.
1

http://www.cplusplus.com/reference/std/new/operator%20new/
http://www.cplusplus.com/reference/std/new/operator%20delete/
Parametr size_t w operatorze new jest zawsze pierwszy i jest obowiązkowy!

void* operator new(size_t rozmiar, parametry_dodatkowe)
void* operator delete(void* ptr, parametry_dodatkowe)

Dodatkowe parametry nie muszą być takie same, to jest tylko standard kodowania by ułatwić zrozumienie związku pomiędzyoeratorami.

0

Parametry muszą być tego samego typu, jeśli chcemy, aby w przypadku wyrzucenia wyjątku z konstruktora został wywołany automatycznie operator delete, aby zwolnić zaalokowaną, ale nie zainicjalizowaną jeszcze pamięć. Książka, którą wymieniłem twierdzi, że aby delete było dopasowane do przeciążonego new powinno być zdefiniowane jako

void operator delete(void*, size_t, parametry);

gdzie parametry to typy z operator new, które występują po size_t.
Po przetestowaniu tego na VC08 i gcc wyszło, że dopasowanie jest, gdy

void operator delete(void*, parametry);

Chciałbym wiedzieć, czy to autorzy książki (Sutter, Alexandrescu) się pomylili , czy jest jakaś inna przyczyna takiego stanu rzeczy.

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