繁体   English   中英

C ++地图插入

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM