Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ map“string”,string >::find看起来返回垃圾迭代器_C++ - Fatal编程技术网

C++ map“string”,string >::find看起来返回垃圾迭代器

C++ map“string”,string >::find看起来返回垃圾迭代器,c++,C++,map::find似乎返回垃圾迭代器,因为我既不能访问my_it->first也不能访问second NB:my_it!=我的地图结束了。VC2010报告了一个调试错误,深入查看会发现 my_it is (Bad Ptr, Bad Ptr). “违规”映射是一个类属性,\u match,在上下文中显示如下: class NicePCREMatch { private: map<string, string, less<string> > _match; pub

map::find似乎返回垃圾迭代器,因为我既不能访问my_it->first也不能访问second NB:my_it!=我的地图结束了。VC2010报告了一个调试错误,深入查看会发现

my_it is (Bad Ptr, Bad Ptr).
“违规”映射是一个类属性,\u match,在上下文中显示如下:

class NicePCREMatch
{
private:
    map<string, string, less<string> > _match;

public:
    void addGroup(const string& group_name, const string& value);
    string group(const string& group_name);
};
下面是按键返回元素的代码,注释掉的代码工作正常:

string NicePCREMatch::group(const string& group_name)
{
    /*for (map<string, string, less<string> >::iterator j = _match.begin(); j != _match.end(); j++)
    {
        if(!strcmp(j->first.c_str(), group_name.c_str()))
        {
            return j->second;
        }
    }

    throw runtime_error("runtime_error: no such group");*/

    map<string, string, less<string> >::iterator i = _match.find(group_name);

    if (i == _match.end())
    {
        throw runtime_error("runtime_error: no such group");
    }

    return i->second;
}
下面是在地图中插入新元素的代码:

void NicePCREMatch::addGroup(const string& group_name, const string& value)
{
    _match.insert(pair<string, string>(group_name, value));
}
另一个类使用NicePCREMatch,如下所示:

template<class Match_t>
vector<Match_t> NicePCRE<Match_t>::match(const string& buf)
{
[snip]
    Match_t m;
[snip]
    m.addGroup(std::string((const char *)tabptr + 2, name_entry_size - 3), \
                buf.substr(ovector[2*n], ovector[2*n+1] - ovector[2*n]));
[snip]
    addMatch(m);
[snip]
    return _matches;
}
void test_NicePCRE_email_match(void)
{
    NicePCRE<> npcre;
    npcre.compile("(?P<username>[a-zA-Z]+?)(?:%40|@)(?P<domain>[a-zA-Z]+\.[a-zA-Z]{2,6})");
    vector<NicePCREMatch> matches = npcre.match("toto@yahoo.com");
    assert(!matches.empty());
    assert(!strcmp(matches.begin()->group("username").c_str(), "toto"));
    cout << matches.begin()->group("domain").c_str() << endl;
    assert(!strcmp(matches.begin()->group("domain").c_str(), "yahoo.com"));
}
在哪里,

template<class Match_t>
void NicePCRE<Match_t>::addMatch(const Match_t& m) 
{ 
    _matches.push_back(m);
}
最后,客户端代码使用NicePCRE类,如下所示:

template<class Match_t>
vector<Match_t> NicePCRE<Match_t>::match(const string& buf)
{
[snip]
    Match_t m;
[snip]
    m.addGroup(std::string((const char *)tabptr + 2, name_entry_size - 3), \
                buf.substr(ovector[2*n], ovector[2*n+1] - ovector[2*n]));
[snip]
    addMatch(m);
[snip]
    return _matches;
}
void test_NicePCRE_email_match(void)
{
    NicePCRE<> npcre;
    npcre.compile("(?P<username>[a-zA-Z]+?)(?:%40|@)(?P<domain>[a-zA-Z]+\.[a-zA-Z]{2,6})");
    vector<NicePCREMatch> matches = npcre.match("toto@yahoo.com");
    assert(!matches.empty());
    assert(!strcmp(matches.begin()->group("username").c_str(), "toto"));
    cout << matches.begin()->group("domain").c_str() << endl;
    assert(!strcmp(matches.begin()->group("domain").c_str(), "yahoo.com"));
}
顺便说一句,这几乎是我最奇怪的TDD:

int main()
{
    int test_cnt = 0;
    cout << "Running test #" << test_cnt << " .." << endl;
    test_NicePCRE_email_match();
    cout << "OK." << endl << endl;
    test_cnt++;

    SleepEx(5000, 1);

    return 0;
}
我做错了什么

编辑: 与上述版本相比,以下修改解决了我的问题。即

void NicePCREMatch::addGroup(const string& group_name, const string& value)
{
    _match.insert(pair<string, string>(group_name.c_str(), value.c_str()));
}
现在稍微修改的客户端代码如下所示:

void test_NicePCRE_email_match(void)
{
    NicePCRE<> npcre;
    npcre.compile("(?P<username>[a-zA-Z]+?)(?:%40|@)(?P<domain>[a-zA-Z]+\.[a-zA-Z]{2,6})");
    vector<NicePCREMatch> matches = npcre.match("toto@yahoo.com");
    assert(!matches.empty());
    try
    {
        assert(!strcmp(matches.begin()->group("username").c_str(), "toto"));
        assert(!strcmp(matches.begin()->group("domain").c_str(), "yahoo.com"));
        cout << "username = " << matches.begin()->group("username") << endl;
        cout << "domain = " << matches.begin()->group("domain") << endl;
    }
    catch (const runtime_error& e)
    {
        cout << "Caught: " << e.what() << endl;
        assert(0x0);
    }
}
这很奇怪。有人能解释一下吗。但是,我认为我的问题已经解决了。
谢谢大家

这可能是由三件事引起的:要么在执行find之后以某种方式修改映射,要么程序中的某个地方内存崩溃,要么调试器没有显示迭代器的正确值

尝试使用调试输出-如果在尝试输出值时代码崩溃,那么迭代器可能真的坏了

还要确保在执行find之后不会修改映射。如果这样做,这可能会使迭代器无效,因此需要在使用迭代器之前立即移动find调用


如果以上两个选项都没有帮助,您可能在某个地方出现内存损坏,您需要找到它。也许用这个。请注意,只有在其他两个选项被证明是不可能的情况下,这才是您的最后手段。

这可能是由三件事造成的-要么是在执行“查找”后以某种方式修改映射,要么是程序中某个地方内存耗尽,要么是调试器没有显示迭代器的正确值

尝试使用调试输出-如果在尝试输出值时代码崩溃,那么迭代器可能真的坏了

还要确保在执行find之后不会修改映射。如果这样做,这可能会使迭代器无效,因此需要在使用迭代器之前立即移动find调用

如果以上两个选项都没有帮助,您可能在某个地方出现内存损坏,您需要找到它。也许用这个。请注意,只有当其他两种选择被证明不可能时,这才是您的最后选择。

您的问题就在这里

if (i == _match.end())
{
    throw runtime_error("runtime_error: no such group");
}

return i->second;
由于某种原因,您的查找失败。我说不出原因,因为我没有完整的代码。但是,失败之后,你抛出了一个错误,但是外面没有人可以抓住。请在调用方法组的位置添加try-catch,如果未找到匹配项,请实现逻辑。 我尝试使用您的示例代码段+一些更改来编译这些内容,看起来VisualStudio甚至在抛出语句之后仍在继续函数中的下一行。我不知道背后的理论。看到这种行为我有点惊讶

[为了确保您的类结构没有引起问题,我尝试了一个简单的全局方法,甚至该方法也给出了相同的行为。如果有人可以解释,请放心。]

您的问题就在这里

if (i == _match.end())
{
    throw runtime_error("runtime_error: no such group");
}

return i->second;
由于某种原因,您的查找失败。我说不出原因,因为我没有完整的代码。但是,失败之后,你抛出了一个错误,但是外面没有人可以抓住。请在调用方法组的位置添加try-catch,如果未找到匹配项,请实现逻辑。 我尝试使用您的示例代码段+一些更改来编译这些内容,看起来VisualStudio甚至在抛出语句之后仍在继续函数中的下一行。我不知道背后的理论。看到这种行为我有点惊讶


[为了确保您的类结构没有引起问题,我尝试了一个简单的全局方法,甚至该方法也给出了相同的行为。如果有人可以解释,请放心。]

是否可能_match同时被另一个线程修改?这种错误也可能是由线程中其他地方的内存损坏引起的。感谢您代理Bjorn Pollex。否,仅通过单个线程访问_匹配映射。顺便说一句,如果这是由于其他线程的内存损坏或其他一些线程不安全的东西造成的,我如何解释注释掉的代码可以工作,但没有使用map::find调用的代码?在map中减少比较规范有什么需要?没有需要-还没有。但我看不出它会引起什么冒犯。或者是否存在?使用问题类创建测试项目,测试它,如果出现问题,请附加到此处。我没有类似的错误代码复制粘贴您的类和实现主。有可能吗

t_match是否由另一个线程同时修改?这种错误也可能是由线程中其他地方的内存损坏引起的。感谢您代理Bjorn Pollex。否,仅通过单个线程访问_匹配映射。顺便说一句,如果这是由于其他线程的内存损坏或其他一些线程不安全的东西造成的,我如何解释注释掉的代码可以工作,但没有使用map::find调用的代码?在map中减少比较规范有什么需要?没有需要-还没有。但我看不出它会引起什么冒犯。或者是否存在?使用问题类创建测试项目,测试它,如果出现问题,请附加到此处。我没有类似的错误代码复制粘贴您的类和实现main.valgrind不应该是您的最后手段。远非如此。我的意思是,它需要很多努力才能运行,而不是说它无法完成任务。检查我们是否有案例1或案例2将花费更少的时间,这就是为什么我说你应该在排除其他选项后才使用valgrind。这是胡说八道。$valgrind myApp真的很容易输入,无论如何,在开发过程中,您都应该理所当然地使用它;这比花半天时间在代码中分散调试行,然后晚上分析它们的输出要高效得多。如果你开发一个巨大的应用程序,通常需要10分钟来加载,需要30 GB的内存,那么启动valgrind不仅仅是键入valgrind myApp,还需要几个小时。同时,如果您对在何处以及如何节省时间有足够的了解,那么添加调试输出是非常非常错误的。你的应用程序需要克雷超级计算机吗?即使是这样,OP也肯定不会。典型的valgrind跑步是10秒钟的启动和咖啡休息,等待结果。valgrind不应该是你的最后选择。远非如此。我的意思是,它需要很多努力才能运行,而不是说它无法完成任务。检查我们是否有案例1或案例2将花费更少的时间,这就是为什么我说你应该在排除其他选项后才使用valgrind。这是胡说八道。$valgrind myApp真的很容易输入,无论如何,在开发过程中,您都应该理所当然地使用它;这比花半天时间在代码中分散调试行,然后晚上分析它们的输出要高效得多。如果你开发一个巨大的应用程序,通常需要10分钟来加载,需要30 GB的内存,那么启动valgrind不仅仅是键入valgrind myApp,还需要几个小时。同时,如果您对在何处以及如何节省时间有足够的了解,那么添加调试输出是非常非常错误的。你的应用程序需要克雷超级计算机吗?即使是这样,OP也肯定不会。一个典型的valgrind跑步是一个10秒的启动和一个咖啡休息时间,同时你等待结果。嗨,乌尼确实是运行时错误运行时错误:在类方法字符串NicePCREMatch::group中没有抛出这样的组,但在我的无效测试中没有捕获到这样的组。但是,出于某种奇怪的原因,VS2010没有报告运行时错误,因为它会给我错误的Ptr错误信息。我尝试在void test\u NicePCRE\u email\u match中捕获逻辑,并捕获运行时错误运行时错误:没有这样的组。-我对我未显示的向量NicePCRE::match启发式很有信心,那么为什么会发现。。失败答案在我的编辑中。谢谢你这么说,在更改了_match.insertpairgroup_name.c_str,value.c_str;查找开始提供有效的迭代器?再次感谢@Unni。顺便说一句,有人点击/投票给你吗?为什么?还是我在这里遗漏了什么?如果是的话,我多么希望我有足够的声誉来立即撤销它:。没关系,生活就是这样:-你可以接受这个答案-是的,将_match.insertpairgroup_name,value更改为_match.insertpairgroup_name.c_str,value.c_str后,查找开始提供有效的迭代器。您好。-确实是运行时错误运行时错误:在类方法字符串NicePCREMatch::group中没有抛出这样的组,但在我的无效测试中没有捕获到这样的组。但是,出于某种奇怪的原因,VS2010没有报告运行时错误,因为它会给我错误的Ptr错误信息。我尝试在void test\u NicePCRE\u email\u match中捕获逻辑,并捕获运行时错误运行时错误:没有这样的组。-我对我未显示的向量NicePCRE::match启发式很有信心,那么为什么会发现。。失败答案在我的编辑中。谢谢你这么说,在更改了_match.insertpairgroup_name.c_str,value.c_str;查找开始提供有效的迭代器?再次感谢@Unni。顺便说一句,有人点击/投票给你吗?为什么?还是我在这里遗漏了什么?如果是的话,我多么希望我有足够的声誉来撤销它
t:没关系,生活就是这样:-你可以接受答案-是的,将_match.insertpairgroup_name,value更改为_match.insertpairgroup_name.c_str,value.c_str后,查找开始提供有效的迭代器。