0
// 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(下)是动态分配的。 soundEffects是一个std::map。每当我尝试将指向的值插入newSoundEffectintosoundEffects时,都会触发析构函数SoundEffect,并且由于某种原因,当析构函数尝试删除时m_data,我收到错误“访问冲突读取位置 0xCCCCCCCC。我在某处读到此位置表示未初始化的内存什么的。但是在上面的代码片段中,使用 Visual Studio 的调试器,我可以确认指向一个有效m_datanewSoundEffect内存序列。我做错了什么?

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

编辑:由于@Chad的建议,我继续在SoundEffect类中添加了一个复制构造函数,但它没有帮助,因为虽然newSoundEffect当我尝试将它放入时肯定是构造soundEffects的,但复制构造函数接收到一个具有未初始化成员变量的对象; 一个未初始化的SoundEffect.

4

4 回答 4

1

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

阅读本文: 三法则

于 2013-11-11T01:42:40.703 回答
0

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

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

于 2013-11-11T01:43:22.547 回答
0

需要看构造函数。

但是微软世界中的 0xCCCCCCCC 表示它没有被分配。

于 2013-11-11T01:42:55.940 回答
0

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

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

于 2013-11-11T01:43:00.520 回答