MFC中CMapWordToOb类序列化失效,运行时崩溃求助
CMapWordToOb序列化崩溃问题解决
问题根源及修复步骤
1. CAge类缺少自定义Serialize方法
你使用了DECLARE_SERIAL(CAge)宏,但未实现对应的Serialize函数。MFC序列化CObject派生类时,会依赖该方法读写成员变量,默认的CObject::Serialize仅处理类版本信息,不会序列化你的m_age成员,这会直接导致序列化过程中数据异常,触发断言或崩溃。
修复:给CAge类添加Serialize方法:
class CAge : public CObject { DECLARE_SERIAL(CAge) public: CAge() {} CAge(int age) : m_age(age) {} int getAge() const { return m_age; } // 必须实现的序列化方法 void Serialize(CArchive& ar) override { // 先调用基类处理版本信息 CObject::Serialize(ar); if (ar.IsStoring()) { // 存储时写入成员变量 ar << m_age; } else { // 加载时读取成员变量 ar >> m_age; } } private: int m_age; };
2. CompareMaps函数存在逻辑漏洞
CompareMaps函数在所有检查通过后未返回true,会导致函数返回未定义值,引发后续判断错误。
修复:在函数末尾添加返回语句:
bool CompareMaps(const CMapWordToOb& map1, const CMapWordToOb& map2) { // 原有检查逻辑... // 所有检查通过后返回true return true; }
3. MFC运行时未初始化
直接使用main函数启动MFC相关操作(如CFile、CArchive)会导致MFC运行环境未正确初始化,这也是崩溃的潜在原因。
修复:在main函数中添加MFC初始化代码:
int main() { // 初始化MFC运行时环境 AfxWinInit(GetModuleHandle(NULL), NULL, GetCommandLine(), 0); TestSerializeCMapWordtoOb(); return 0; }
4. 内存泄漏优化(可选)
CMapWordToOb反序列化时会自动创建新的CAge对象,而原始map中的对象由new创建,需手动释放避免内存泄漏:
// 释放map中的对象 void FreeMapObjects(CMapWordToOb& map) { POSITION pos = map.GetStartPosition(); CAge* pa; WORD key; while (pos != NULL) { map.GetNextAssoc(pos, key, (CObject*&)pa); delete pa; } map.RemoveAll(); } // 在TestSerializeCMapWordtoOb函数末尾添加: FreeMapObjects(map); FreeMapObjects(deserializedMap);
修复后效果
整合以上修改后,代码可正常完成CMapWordToOb的序列化与反序列化测试,不会再出现运行时中止窗口。
内容的提问来源于stack exchange,提问作者aniket
相关产品推荐
相关产品推荐

