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。 我在某处读到这个位置表示未初始化的内存或其他东西。 但是在上面的代码片段中,使用 Visual Studio 的调试器,我可以确认m_data
newSoundEffect
指向有效的内存序列。 我做错了什么?
~SoundEffect()
{
if (m_data != NULL)
delete [] m_data; // Error :(
}
编辑:由于@Chad的建议,我继续向SoundEffect
类添加一个复制构造函数,但它没有帮助,因为尽管当我尝试将其放入soundEffects
时newSoundEffect
肯定是构造的,但复制构造函数接收一个具有未初始化成员变量的对象; 未初始化的SoundEffect
。
您的SoundEffect
类将需要复制构造函数和复制赋值运算符才能以这种方式使用。
阅读:三法则
需要查看构造函数。
但是微软世界的0xCCCCCCCC意味着它还没有被分配。
简短回答:实现复制构造函数以适当地复制m_data的字节(通过重新分配新的缓冲区,并适当地复制字节)。
另一个答案是:将地图设置为SoundEffect*(指针)的地图,而不是SoundEffect实例。不要在将 newSoundEffect 插入地图后将其删除。
soundEffects[name] = (*newSoundEffect);
正在尝试将SoundEffect
对象的副本放入映射中。
我很确定您只想将SoundEffect*
存储为地图值,而不是SoundEffect
对象。
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如果我将嵌套映射作为多重映射的值,如何将值插入内部映射?
- 将包含不可复制对象的对插入到映射中
- 在映射中插入一对时,C++是否需要额外的代码
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- 在 c++ 中使用带有映射的插入效率
- 如何编写用于多映射插入和擦除功能的 API?
- 如何将元素插入和迭代到这种映射.C++
- 将数组的元素插入映射的时间复杂度是多少?
- 在映射中插入配对键
- 如何将整数向量插入到键中,标准::映射的值
- 将唯一指针插入std::映射
- 如何将带指针的结构插入到映射中
- std::映射导致插入时出现C2664错误
- 在共享内存中插入映射映射时出现编译器错误
- 将元素插入 c++ 映射 - 插入方法的差异
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- 插入映射<字符串,结构>错误
- 在公共方法中插入映射(私有属性)后出现分割故障
- 通过移动mapped_type的 r 值插入映射条目