使用 std::map 作为本地成员的内存访问冲突
memory access violation using std::map as local member
我在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启动的内存空间重叠,
相关文章:
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 具有 STL 向量类型成员的类的复制内存
- C++具有模板成员变量的类. 和参数内存输出
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 删除类成员的动态分配内存的最佳方法是什么
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 使用 delete [] 运算符取消分配类中数据成员的内存
- 调用std::函数成员时内存损坏
- c++如何为类成员函数分配内存
- 当我们在C++中创建类的对象时,为成员函数分配的内存在哪里?
- QThreads - 为什么要在构造函数中分配内存而不是使用普通的类成员?
- POD 结构(相同类型的成员):成员是否位于连续的内存位置?
- 当课程成员成员时,为什么参考会占据内存
- C++非虚拟类成员变量内存布局?
- 非静态数据成员初始值设定项仅适用于 和动态内存
- 使用初始值设定项列表的初始化类成员会导致内存泄漏
- "new"不会将内存分配给作为类的数据成员的指针
- 对象和数据成员内存地址混淆
- C++ 删除析构函数中的向量类成员内存
- 类数据成员内存布局显示指针大小过大