boost shared_ptr的自定义删除器

时间:2012-03-31 17:36:50

标签: c++ memory-management boost shared-ptr smart-pointers

我有一个关于为boost::shared_ptr构造函数提供自定义删除方法的问题。

例如,我有一个GameObjectFactory类,用于创建/销毁GameObjects。它有一个MemoryManager的实例,可以Allocate()/Deallocate()内存。 CreateObject()返回GameObject,通过MemoryManager分配,封装在boost::shared_ptr

boost::shared_ptr破坏时,它应该调用我的MemoryManager->Deallocate()方法。但是我做不到;我收到这些错误:

error C2276: '&' : illegal operation on bound member function expression
error C2661: 'boost::shared_ptr<T>::shared_ptr' : no overloaded function takes 2 arguments

我已经阅读了boost文档以及我从stackoverflow获得的点击量,但我无法做到正确。我不明白为什么下面的dosnt工作。

这是我的代码;

#ifndef _I_GAMEOBJECT_MANAGER_H
#define _I_GAMEOBJECT_MANAGER_H

#include "../../Thirdparty/boost_1_49_0/boost/smart_ptr/shared_ptr.hpp"

#include "EngineDefs.h"
#include "IMemoryManager.h"
#include "../Include/Core/GameObject/GameObject.h"

namespace Engine
{
    class IGameObjectFactory
    {
    public:
        virtual ~IGameObjectFactory() { }

        virtual int32_t Init() = 0;
        virtual bool Destroy() = 0;
        virtual bool Start() = 0;
        virtual bool Stop() = 0;
        virtual bool isRunning() = 0;
        virtual void Tick() = 0;

        template <class T>
        inline boost::shared_ptr<T> CreateObject()
        {
            boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T)),&mMemoryMgr->Deallocate);


            return ptr;
        }

        template <class T>
        inline boost::shared_ptr<T> CreateObject(bool UseMemoryPool)
        {
            boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T),UseMemoryPool), &mMemoryMgr->Deallocate);


            return ptr;
        }

    protected:
        IMemoryManager* mMemoryMgr;
    };

}

#endif

2 个答案:

答案 0 :(得分:8)

shared_ptr期望删除器是一个接受作为指针类型(T*)的单个参数的函数。您试图将其传递给成员函数,并且由于shared_ptr没有对IMemoryManager对象的引用,因此它不起作用。要解决此问题,请创建一个接受指针对象并调用IMemoryManager :: Deallocate()的静态成员函数:

template <class T>
static void Deallocate(T* factoryObject)
{
    factoryObject->mMemoryMgr->Deallocate();
}

然后您可以像这样创建shared_ptr:

boost::shared_ptr<T> ptr((T*) mMemoryMgr->Allocate(sizeof(T),UseMemoryPool), &IGameObjectFactory::Deallocate<T>);

答案 1 :(得分:1)

boost::shared_ptr以及std::shared_ptr将谓词作为自定义删除工具。所以你可以传递一个函数或一个函子。你传递的是一个指向成员函数的指针,由于你没有指向对象的指针,因此它不足以调用它。您需要学习Pointers to member functions了解详情。有很多方法可以实现你想要的东西,我会编写自己的简单仿函数来记住一个对象工厂指针,并调用一个适当的方法来删除shared_ptr后调用它。另外,请考虑使用intrusive_ptr,除非您确实需要shared_ptr。它效率更高。