Увеличить shared_ptr с перегруженным размещением new / delete - PullRequest
5 голосов
/ 15 ноября 2010

Я использую boost shared_ptr со своим собственным диспетчером памяти, как этот (упрощенный пример, надеюсь, в нем нет ошибок):

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);
}
};

И я использую его так:

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

Но теперь я осознаю.Если shared_ptr удаляет мой объект, он вызывает Deleter :: operator () и объекты удаляются.Но деструктор не вызывается ...

Как я могу это изменить?

Ответы [ 2 ]

8 голосов
/ 15 ноября 2010

Поскольку средство удаления должно уничтожить объект:

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

Редактировать: я ошибся в своем устройстве исправления, исправлено

0 голосов
/ 15 ноября 2010

Вы можете явно вызвать деструктор (что означает, что Deleter, вероятно, должен получить T * вместо void *).Обратите внимание, что код, который вы предоставили, на самом деле не использует размещение new / delete, поэтому мой ответ имеет смысл только для этого конкретного примера.

...