我在旧版 MFC 应用程序中声明了一个 std::map:
typedef std::map<long, CNutrientInfo> NUTRIENT_INFO_MAP;
typedef NUTRIENT_INFO_MAP::const_iterator NUTRIENT_INFO_ITER;
typedef NUTRIENT_INFO_MAP::value_type NUTRIENT_INFO_PAIR;
static NUTRIENT_INFO_MAP m_NutrientInfoMap;
m_NutrientInfoMap 在应用程序加载时通过循环遍历表并创建 CNutrientInfo 实例然后将其插入到 std:map 中来填充,如下所示:
m_NutrientMapInfo.insert(NUTRIENT_INFO_PAIR(nutrient.GetId(), nutrient));
std::map 现在包含由数据库定义的营养素列表。在某些时候,用户可以将新的营养素添加到此列表中,并检查用户添加的内容是否已存在于列表中。它会像这样检查:
NUTRIENT_INFO_ITER iter = m_NutrientInfoMap.begin();
while (iter != m_NutrientInfoMap.end())
{
m = (*iter).second;
if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0)
{
return m;
}
iter++;
}
或者至少它应该是。当函数实际被调用时,它永远不会超过 while 循环的初始行。在那里放置一个断点只是表明有问题的行被一遍又一遍地调用并且永远不会超过它,这会挂起应用程序。如果您进入实际比较,它会正确比较,然后返回到 while 循环行。再次进入循环体只是返回到 while 循环行。同样的逻辑在应用程序的其他地方使用没有问题,所以我很难理解在这种情况下发生了什么。我已经使用 for 循环重新编写了上面的逻辑,它工作得很好,所以我并不是无法解决它,但 C++ 不是我最强大的语言,因为这是我的遗留应用程序我试图帮助支持,我' 我真的很想学习和理解为什么这样做是为了将来参考。另外,由于逻辑在其他地方而不是在这里起作用,因此可能有一个根本原因是实际需要解决的问题。
对此的任何建议或想法将不胜感激。
提前致谢。