Estoy tratando de hacer un Memory Manager basandome en la info que te explican en el libro "C++ for Game Programmers". El problema es que no tengo el cd con las soluciones propuestas, y no se solucionar un error.
Posteo primero el código y ahora comento:
Heap.h
- Código: Seleccionar todo
#ifndef Heap_H
#define Heap_H
#include <string>
#include <stdlib>
class Heap
{
public:
Heap(){};
Heap(const std::string& name):
mName(name),
mAllocs(0),
mAllocMem(0){};
~Heap(){};
void addAllocation(size_t size){ mAllocs++; mAllocMem += size; };
void remAllocation(size_t size){ mAllocs--; mAllocMem -= size; };
void* operator new(size_t size)
{
return malloc(size);
};
void operator delete(void* pMem)
{
free(pMem);
};
private:
std::string mName;
int mAllocs;
long int mAllocMem;
};
struct AllocHeader
{
int nSize;
unsigned int nSignature;
Heap* pHeap;
};
#endif
HeapFactory.h
- Código: Seleccionar todo
#ifndef HEAPFACTORY_H_INCLUDED
#define HEAPFACTORY_H_INCLUDED
#include "Heap.h"
#include <assert>
class HeapFactory
{
public:
HeapFactory(){};
~HeapFactory() {};
static Heap* getDefaultHeap() {return mDefaultHeap; };
static Heap* mDefaultHeap;
};
Heap* HeapFactory::mDefaultHeap = new Heap("Default");
void* operator new(size_t size, Heap* pHeap)
{
int nRequested_bytes = size + sizeof(AllocHeader) + sizeof(int);
char* pMem = (char*)malloc(nRequested_bytes);
AllocHeader* pHeader = (AllocHeader*)pMem;
pHeader->pHeap = pHeap;
pHeader->nSize = size;
pHeader->nSignature = 0xDEADC0DE;
pHeap->addAllocation(size);
void* pStart_memblock = pMem + sizeof(AllocHeader);
int* pEnd_block = (int*)pStart_memblock + size;
*pEnd_block = 0x1578E34D;
return pStart_memblock;
};
void* operator new(size_t size)
{
return ::operator new(size, HeapFactory::getDefaultHeap());
};
void operator delete(void* pMem)
{
AllocHeader* pHeader = (AllocHeader*)pMem - sizeof(AllocHeader);
assert(pHeader->nSignature == 0xDEADC0DE);
int* pEnd_memBlock = (int*)pMem + pHeader->nSize;
assert(*pEnd_memBlock == 0x1578E34D);
pHeader->pHeap->remAllocation(pHeader->nSize);
free (pHeader);
};
#endif // HEAPFACTORY_H_INCLUDED
El problema es el siguiente:
Yo quiero crear "Heaps" dinamicamente, pero el problema es que para el nuevo new necesito un Heap.
Mi solución, ha sido sobrecargar el operador new y delete de la clase Heap, para de esa manera llamar directamente a malloc y free y no tener ningún problema con los new y delete globales.
Pero cuando testeo mi código, resulta que a pesar de tener sobrecargados los operadores en la clase, me llama a los globales.
Alguien sabe a que se debe. ¿No pueden convivir ambos operadores sobrecargados? ¿Me falta algún punto?
Gracias a todos