簡體   English   中英

string :: replace在有效的迭代器上拋出std :: out_of_range

[英]string::replace throws std::out_of_range on valid iterators

真的無法弄清楚拋出``std :: out_of_range''實例后調用``終止''的原因

std::cerr << std::string(s[0].first, s[0].second) << std::endl;
std::cerr << std::string(e[0].first, e[0].second) << std::endl;
std::cerr << std::string(s[0].first, e[0].second) << std::endl;

上面的代碼返回具有匹配結果的有效字符串

    boost::regex start(elementStartTag);
    boost::regex end(elementEndTag);

    boost::match_results<std::string::const_iterator> s, e;

    if(!boost::regex_search(tmpTemplate, s, start)) {
        dDebug() << "No start token: " << elementStartTag << " was found in file: " << templatePath();
        std::cerr << "No start token: " << elementStartTag << " was found in file: " << templatePath() << std::endl;
        return;
    }

    if(!boost::regex_search(tmpTemplate, e, end)) {
        dDebug() << "No end token: " << elementEndTag << " was found in file: " << templatePath();
        std::cerr << "No end token: " << elementEndTag << " was found in file: " << templatePath() << std::endl;
        return;
    }

    //std::string::iterator si, ei;
    //        si = fromConst(tmpTemplate.begin(), s[0].second);
    //        ei = fromConst(tmpTemplate.begin(), e[0].first);

    //        std::cerr << std::string(si, ei) << "\t" << ss.str(); // return valid string

    std::cerr << std::string(s[0].first, s[0].second) << std::endl;
    std::cerr << std::string(e[0].first, e[0].second) << std::endl;
    std::cerr << std::string(s[0].first, e[0].second) << std::endl;


    std::cerr << "s[0].first - tmpTemplate.begin()\t" << s[0].first - tmpTemplate.begin() << std::endl;
    std::cerr << "s[0].first - e[0].second\t" << s[0].first - e[0].second << std::endl;

    //tmpTemplate.replace(fi, se, ss.str()); //also throws exeption
    tmpTemplate.replace(s[0].first - tmpTemplate.begin(), s[0].first - e[0].second, "test"); // throws exeption

gcc版本:4.7.3如果真的很重要

提升版:1.52.0

更新:

首先:以下等式是錯誤的s [0] .first-e [0] .second應該是e [0] .second-s [0] .first-我想知道為什么沒人看到這個(我也是)-但考慮一下錯字,導致s [0] .first-tmpTemplate.begin()始終返回負數。

tmpTemplate定義並初始化為

  std::string tmpTemplate= getTemplate();

太好了-正如我所說的s [0] .first-tmpTemplate.begin()返回負數

如果tmpTemplate被定義並初始化為

std::string tmpTemplate(getTemplate().data(), getTemplate().length());

一切順利。

第二:

停止boost :: match_results未初始化的廢話,請閱讀regex_search文檔,其中指出:“如果沒有找到匹配項,則返回false”

第三:

std::string tmpTemplate= getTemplate();

std::string tmpTemplate(getTemplate().data(), getTemplate().length());

確實有所不同。

自己的加入:

這是一個以太內存損壞,它發生在我的代碼中的其他地方,而我用valgrind無法檢測到它,或者是一個不屬於我的代碼的錯誤。

什么是內容tmpTemplateelementStartTagelementEndTag 如果elementEndTag先於elementStartTagtmpTemplate ,那么你一定會得到一個out_of_range錯誤。

最后,我建議僅使用一個正則表達式,大致如下:

boost::regex matcher( ".*(" + elementStartTag + ")(.*)(" + elementEndTag + ").*");

然后使用boost::regex_match而不是搜索。 這保證了訂單; 但是,如果序列中有多個匹配元素,可能會導致問題。 如果這是一個問題:您應該使用:

boost::regex_search( s[1].second, tmpTemplate.end(), e, end )

作為匹配末尾的表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM