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