5

私は、このように独自のメモリ マネージャーで 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 が onject を削除すると、Deleter::operator() が呼び出され、オブジェクトが削除されます。しかし、デストラクタは呼び出されません...

どうすればこれを変更できますか?

4

2 に答える 2

8

削除者はオブジェクトを破棄する必要があるため:

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

編集:削除者が間違っていたので修正しました

于 2010-11-15T07:35:14.857 に答える
0

デストラクタを明示的に呼び出すことができます (つまり、はおそらくではなく をDeleter受け取るはずです)。あなたが提供したコードは実際には配置の新規/削除を使用していないことに注意してください。したがって、私の答えはこの特定の例に対してのみ意味があります。T *void *

于 2010-11-15T07:34:26.390 に答える