1

关于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;
}
4

0 回答 0