// 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
。每当我尝试将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
。
答案 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
个对象。