Problema con sobrecarga de operadores new

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Problema con sobrecarga de operadores new

Notapor Juanxo » Lun Feb 01, 2010 2:21 am

Buenas a todos:

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
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado