0

我在旧版 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++ 不是我最强大的语言,因为这是我的遗留应用程序我试图帮助支持,我' 我真的很想学习和理解为什么这样做是为了将来参考。另外,由于逻辑在其他地方而不是在这里起作用,因此可能有一个根本原因是实际需要解决的问题。

对此的任何建议或想法将不胜感激。

提前致谢。

4

2 回答 2

3

您的示例实际上是从源代码粘贴的吗?也许它看起来更像:

while (iter != m_NutrientInfoMap.end());   // <== note the semi-colon
{
    m = (*iter).second;
    if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0)
    {
        return m;
    }
    iter++;
}
于 2009-04-21T16:43:44.197 回答
0

上面发布的代码中没有任何内容会导致这种行为。您确定要在循环内递增其他迭代器,还是可能有两个具有相同名称的迭代器(一个在循环内)具有不同的范围,并且您正在递增错误的迭代器?如果不是这种情况,那么我能看到的唯一其他选择是记下 m_NutrientInfoMap.end() 的值并检查为什么 ++iter 没有评估该值。

于 2009-04-21T17:08:24.213 回答