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