delete[]: Как вызвать деструкторы?
От: _Winnie Россия C++.freerun
Дата: 24.07.05 14:56
Оценка:
Предположим, я написал свой 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[] ?
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.