C++映射插入

C++ map insertion

本文关键字:插入 映射 C++      更新时间:2023-10-16
// 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类添加一个复制构造函数,但它没有帮助,因为尽管当我尝试将其放入soundEffectsnewSoundEffect肯定是构造的,但复制构造函数接收一个具有未初始化成员变量的对象; 未初始化的SoundEffect

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

阅读:三法则

需要查看构造函数。

但是微软世界的0xCCCCCCCC意味着它还没有被分配。

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

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

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

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