使用 std::map 作为本地成员的内存访问冲突

memory access violation using std::map as local member

本文关键字:成员 内存 访问冲突 std map 使用      更新时间:2023-10-16

我在Algo::Init()中调用方法v_init()期间m_Lights=tmp;行上出现内存访问冲突错误。不应该在m_LightsManager实例化时创建映射m_Lights吗? 为什么会出现此错误?

class LightManager 
 {
 private:
   std::map<sint32,Light> m_Lights;
  public:
   LightManager (void);
  ~LightManager (void);
  void v_init();
 };
LightManager ::LightManager (void)
{
}

LightManager ::~LightManager (void)
{
}
void LightManager ::v_init()
 {
  Light tL;
  std::memset(&tL,0,sizeof(Light));
  std::map<sint32,Light> tmp;
  tmp.insert(std::pair<sint32,Light> (-1,tL));
  m_Lights=tmp;
 }
class Algo 
{
 private:    
  LightsManager m_LightsManager;
 ....
 public:
 Algo();
 void Init();
 };
  Algo::Algo()
  {
  Init();
   }

 void Algo::Init()
 {
   m_LightsManager.v_init();
 }

如果Light不是平凡可复制的,那么

std::memset(&tL,0,sizeof(Light));

未定义的行为。这可能是导致错误的原因。

除了 Vittorios 回答:在 Light 的构造函数中执行所有初始化,而不是依赖外部memset调用。并且不要在C++中使用std::memset在一个语句中初始化对象的所有成员变量,而是为每个变量显式执行此操作(通常使用简单的赋值;在 C++11 中,您甚至可以在声明/标头中执行此操作,恕我直言)。

原因:可以派生Light,基类定义自己的数据,您可以通过鲁莽地清空整个对象来覆盖这些数据。

我解决了错误,问题来自软体其他部分中的错误声明指针,该指针与对象m_LightsManager启动的内存空间重叠,