【问题标题】:Boost shared_ptr with overloaded placement new/delete使用重载放置 new/delete 提升 shared_ptr
【发布时间】:2010-11-15 07:26:48
【问题描述】:

我正在像这样将 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() 并且对象被删除。但是没有调用析构函数...

我该如何更改?

【问题讨论】:

    标签: c++ memory-management shared-ptr placement-new


    【解决方案1】:

    因为删除器应该销毁对象:

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

    编辑:我的删除器出错了,已修复

    【讨论】:

      【解决方案2】:

      您可以显式调用析构函数(这意味着Deleter 可能应该收到T * 而不是void *)。请注意,您提供的代码实际上并未使用placement new/delete,因此我的回答仅对这个特定示例有意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        • 1970-01-01
        • 2017-12-07
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 2013-05-19
        相关资源
        最近更新 更多