Первое, о чем я могу подумать, это использовать boost::shared_ptr<void>
(для версии без массива может потребоваться некоторая работа для его адаптации к версии массива) в качестве типа указателя. И я думаю, что следует позаботиться в основном о каждой детали. Всякий раз, когда кадр уничтожается, память будет соответствующим образом удалена:
struct FrameMemory
{
uint32 frameIndex;
// bool allocatedType; //0 = new(), 1 = new[] only works with instances, not arrays
boost::shared_ptr<void> pMemPtr;
};
Если вы хотите реализовать нечто подобное вручную, вы можете использовать указатель функции «delete» для обработки удаления объектов вместо непосредственного вызова delete
. Вот приблизительный подход к тому, как вы могли бы изменить свой код:
// helper deleter functions
template <typename T>
void object_deleter( void *p ) {
delete static_cast<T*>(p);
}
template <typename T>
void array_deleter( void *p ) {
delete [] static_cast<T*>(p);
}
class FrameMemory
{
public:
const uint32 frameIndex;
void* pMemPtr;
private:
void (*deleter)(void*);
public:
template <typename T>
FrameMemory( uint32 frame, T* memory, bool isarray = false )
: frameIndex(frame), pMemPtr(memory),
deleter( isarray? array_deleter<T> : object_deleter<T> )
{}
void delete() {
deleter(pMemPtr)
}
};
struct X;
void usage()
{
{
FrameMemory f( 1, new X );
f.delete();
}
{
FrameMemory f( 1, new x[10], true );
f.delete();
}
}
Я бы изменил его так, чтобы вместо необходимости вызывать FrameMemory::delete()
, который был выполнен в деструкторе, но это заняло бы больше времени, чем у меня сейчас, чтобы сделать правильно (то есть решить, как будут обрабатываться копии и так далее ...