[英]C++ map insertion
// 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。 location表示未初始化的内存或其他东西,但是在上面的代码段中,使用Visual Studio的调试器,我可以确认m_data
中的newSoundEffect
指向有效的内存序列,我在做什么错呢?
~SoundEffect()
{
if (m_data != NULL)
delete [] m_data; // Error :(
}
编辑 :由于@乍得的建议下,我继续,并增加了拷贝构造函数的SoundEffect
类,但它并没有帮助,因为虽然newSoundEffect
当我试图把它变成绝对是构建soundEffects
,拷贝构造函数接收与对象未初始化的成员变量; 未初始化的SoundEffect
。
您的SoundEffect
类将需要一个复制构造函数和一个复制赋值运算符以这种方式使用。
阅读此: 三个规则
需要看构造函数。
但是在Microsoft World中,0xCCCCCCCCCC表示尚未分配。
简短的答案:实现一个复制构造函数以适当地复制m_data的字节(通过重新分配一个新的缓冲区,并适当地复制这些字节)。
另一个答案:使您的地图成为SoundEffect *(指针)的地图,而不是SoundEffect实例。 将newSoundEffect插入地图后,请勿删除它。
soundEffects[name] = (*newSoundEffect);
正在尝试将SoundEffect
对象的副本放入地图中。
我敢肯定,您只想存储SoundEffect*
作为映射值,而不是SoundEffect
对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.