Предположим, я написал свой operator new/new[] с тегом-параметром, который выделяет память так, как мне надо
struct SInterthreadAllocTag {};
static SInterthreadAllocTag InterthreadAllocTag;
inline void *operator new(size_t size, SInterthreadAllocTag)
{
return malloc(size);
}
inline void *operator new[](size_t size, SInterthreadAllocTag)
{
return malloc(size);
}
Так же я написал operator delete:
inline void operator delete(void *p, SInterthreadAllocTag)
{
free(p);
}
inline void operator delete[](void *p, SInterthreadAllocTag)
{
free(p);
}
теперь я могу написать так:
class MyClass
{
};
...
{
MyClass *p_my_class = new(InterthreadAllocTag) MyClass;
}
как мне теперь вызвать delete?
Вот так не компилируется
delete(InterthreadAllocTag) p_my_class;
Вот так не вызывается деструктор:
operator delete(p_my_class, InterthreadAllocTag);
Я написал шаблонную функцию, которая заместо operator delete вызывает деструктор:
template <class T>
void InterthreadFree(T *p)
{
p->~T();
operator delete(p, InterthreadAllocTag);
}
С ее помощью я могу удалить то, что было выделено по new.
Но как мне удалять то, что было выделено по new[]? Я же не знаю, сколько деструкторов вызвать. Как же в С++ не учли такой простой вещи, вызов своего operator delete[] ?