2010-11-15 41 views
4

J'utilise boost shared_ptr avec mon propre gestionnaire de mémoire comme celui-ci (dépouillée par exemple, je l'espère, il n'y a aucune erreur dans celle-ci):Boost shared_ptr avec le placement surchargé nouveau/supprimer

class MemoryManager 
{ 
public: 
    /** Allocate some memory.*/ 
    inline void* allocate(size_t nbytes) 
    { 
     return malloc(nbytes); 
    } 
    /** Remove memory agian.*/ 
    inline void deallocate(void* p) 
    { 
     free(p); 
    } 


}; 

MemoryManager globalMM; 

// New operators 
inline void* operator new(size_t nbytes, ogl2d::MemoryManagerImpl& mm) 
{ 
    return globalMM.allocate(nbytes); 
} 

// Corresponding delete operators 
inline void operator delete(void *p, ogl2d::MemoryManagerImpl& mm) 
{ 
    globalMM.deallocate(p); 
} 

/** Class for smart pointers, to ensure 
    * correct deletion by the memory manger.*/ 
class Deleter 
{ 
public: 
    void operator()(void *p) { 
    globalMM.deallocate(p); 
} 
}; 

Et je l'utilise comme ceci:

shared_ptr<Object>(new(globalMM) Object, Deleter); 

Mais maintenant je me rends compte. Si shared_ptr supprime mon objet, il appelle Deleter :: operator() et les objets sont supprimés. Mais le destructeur ne se fait pas appeler ...

Comment puis-je changer cela?

Répondre

7

Parce que Deleter détruire l'objet doit:

class Deleter 
{ 
public: 
    void operator()(Object *p) { 
    p->~Object(); 
    globalMM.deallocate(p); 
    } 
}; 

Edit: Je me suis trompé dans mon Deleter, fixé

0

Vous pouvez appeler explicitement le destructeur (ce qui signifie que le Deleter devrait probablement recevoir un T * au lieu d'un void *). Notez que le code que vous avez fourni n'utilise pas réellement l'emplacement new/delete, donc ma réponse n'est significative que pour cet exemple particulier.