C ++地图插入

时间:2013-11-11 01:38:33

标签: c++ memory map

// Create sound effect
SoundEffect* newSoundEffect = new SoundEffect(frequencyArray);

if (soundEffects.find(name) == soundEffects.end())
    soundEffects[name] = (*newSoundEffect);

// Clean up memory
delete [] frequencyArray;
delete newSoundEffect;

frequencyArray(上方)和m_data(下方)是动态分配的。 soundEffectsstd::map。每当我尝试将newSoundEffect指向的值插入soundEffects时,就会触发SoundEffect的析构函数,并且由于某种原因,当析构函数尝试删除m_data时,我收到错误“访问冲突读取位置0xCCCCCCCC。我在某处读到这个位置表示未初始化的内存或其他东西。但在上面的代码片段中,使用Visual Studio的调试器,我可以在m_data中确认newSoundEffect指向有效的记忆序列。我做错了什么?

~SoundEffect()
{
    if (m_data != NULL)
        delete [] m_data; // Error :(
}

编辑:由于@ Chad的建议,我继续向SoundEffect课程添加了一个复制构造函数,但它没有帮助,因为尽管newSoundEffect是当我试图将它放入soundEffects时,复制构造函数接收到一个带有未初始化成员变量的对象;未初始化的SoundEffect

4 个答案:

答案 0 :(得分:1)

您的SoundEffect类需要复制构造函数和复制赋值运算符才能以这种方式使用。

阅读本文:The rule of three

答案 1 :(得分:0)

需要查看构造函数。

但是微软世界中的0xCCCCCCCC意味着它尚未被分配。

答案 2 :(得分:0)

简答:实现一个拷贝构造函数来适当地复制m_data的字节(通过重新分配一个新的缓冲区,并适当地复制字节)。

另一个答案:使地图成为SoundEffect *(指针)的地图,而不是SoundEffect实例。将newSoundEffect插入地图后不要删除它。

答案 3 :(得分:0)

soundEffects[name] = (*newSoundEffect);正在尝试将SoundEffect对象的副本放入地图中。

我很确定您只想存储SoundEffect*作为地图值,而不是SoundEffect个对象。