映射内的c++映射-删除指针

c++ map inside map - delete pointer

本文关键字:映射 删除 指针 c++      更新时间:2023-10-16

我遇到了一个似乎无法解决的问题。我在另一张地图里面有一张地图,里面有两个指针。

std::map<std::string,std::map<sf::SoundBuffer*,sf::Sound*>> listSound;

当我尝试使用以下代码释放分配的内存时,我会得到以下错误:映射/设置迭代器不可递增

如前所述,它是一个调试断言失败,并在Visual studio \11.0\VC\INCLUDE \xtree中的第262行抛出。当我按预期关闭程序时,就会发生这种情况。

这是析构函数中的代码:

~AudioManager()
{
    typedef std::map<sf::SoundBuffer*, sf::Sound*> typeInnerMap;
    typedef std::map<std::string, typeInnerMap> typeOuterMap;
    typedef typeInnerMap::iterator inner_iter_t;
    typedef typeOuterMap::iterator outer_iter_t;
    for (outer_iter_t o = listSound.begin(); o != listSound.end(); ++o)
    {
        for (inner_iter_t i = o->second.begin(); i != o->second.end(); i++)
        {
            delete i->first;
            delete i->second;
        }
    }
}

这就是我插入值的方式:

sf::SoundBuffer* soundbuffer = new sf::SoundBuffer();
soundbuffer->loadFromFile(_file);
sf::Sound* sound = new sf::Sound(*soundbuffer);
typedef std::map<sf::SoundBuffer*, sf::Sound*> mapType;
listSound[_file].insert(mapType::value_type(soundbuffer, sound));

我做错了什么?

提前感谢

编辑:已解决。

问题是,我试图在删除声音之前删除SoundBuffer,这取决于声音缓冲区的开头:

因此,这是有效的:删除i->秒;先删除i->;

问题是,我试图在删除声音之前删除SoundBuffer,这取决于声音缓冲区的开头:

所以这是有效的:删除i->second;先删除i->;