升压:: ptr_map<>和_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)断言失败

时间:2012-04-06 20:21:40

标签: c++ boost c++11 direct3d boost-ptr-container

关于stackoverflow的第一个问题,希望能在这个问题上得到一些帮助。如果你看一下下面的EffectManager类,当一个effectmanager实例被解除分配时,我在_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)上得到一个断言失败。

它与尝试释放效果图的内存有关,如果我从未将效果插入地图,我就不会遇到这个问题。

如果我使用基本STL地图,它也可以正常工作,即

typedef std::map<std::wstring, ID3DXEffect*> EffectsMap;

class EffectManager
{
public:
    typedef boost::ptr_map<std::wstring, ID3DXEffect> EffectsMap;
    EffectManager();
    ~EffectManager();
    void init();
    ID3DXEffect *loadEffect(LPDIRECT3DDEVICE9 d3ddev, std::wstring effectfile);

private:
    std::shared_ptr<EffectsMap> effects_;
};

EffectManager::EffectManager() : effects_(NULL)
{
}

EffectManager::~EffectManager()
{
    for(auto it = effects_->begin(); it != effects_->end(); it++){
        it->second->Release();
    }
}

void EffectManager::init()
{
    effects_ = std::shared_ptr<EffectsMap>(new EffectsMap());
}

ID3DXEffect *EffectManager::loadEffect(LPDIRECT3DDEVICE9 d3ddev, std::wstring effectfile)
{
    if(!effects_)
        return NULL;

    ID3DXEffect *effect;
    if(effects_->count(effectfile)){
        effect = effects_->find(effectfile)->second;
    } else {
        D3DXCreateEffectFromFile(d3ddev, effectfile.c_str(), NULL, NULL, D3DXFX_NOT_CLONEABLE, NULL, &effect, NULL);
        effects_->insert(effectfile, effect);
    }

    return effect;
}

0 个答案:

没有答案