Bugfix: Don't use DECLARE_TYPE() with NULL dealloc
Using a NULL
dealloc will result in calling the wrong destructor, the base class destructor (which isn't virtual) instead of the actual one.
In the ICU4C default configuration (U_OVERRIDE_CXX_ALLOCATION=1
) this isn't immediately noticeable as the operator delete implementation there simply calls uprv_free()
without caring about what is being deleted, but other implementations (U_OVERRIDE_CXX_ALLOCATION=0
) aren't always as cavalier about this.
To resolve this, a new macro that declares a type appropriate dealloc is introduced and used to replace DECLARE_TYPE()
with NULL
dealloc for all ICU4C types with public destructors.
Tested using U_OVERRIDE_CXX_ALLOCATION=0
and TCMalloc.