std :: string ::擦除会导致内存损坏



我坐在这个错误上超过20分钟,我找不到任何错误。std :: string :: erase导致错误。

#include <iostream>
#include <string>
#include <cctype>
template <typename ForwardIt>
std::string trimLeft(std::string string_, ForwardIt begin_, ForwardIt end_)
{
    if (!string_.empty())
    {
        auto it = begin_;
        while (it != end_ && std::isspace(static_cast<unsigned char>(*it)))
            ++it;
        string_.erase(begin_, it);
    }
    return string_;
}
std::string trimLeft(std::string string_)
{
    return trimLeft(string_, string_.begin(), string_.end());
}
int main() {
    std::string str{"   left"};
    // Note: this code would work:
    // str.erase(str.begin(), str.begin() + 3);
    std::cout << "|" << trimLeft(str) << "|" << std::endl;
    std::cout << "|" << trimLeft(std::string{"z left"}) << "|" << std::endl;
    std::cout << "|" << trimLeft(std::string{"tleft"}) << "|" << std::endl;
}

仔细查看您的签名:

template <typename ForwardIt>
std::string trimLeft(std::string string_, ForwardIt begin_, ForwardIt end_)
//                   ~~~~~~~~~~~~

string_是一个值,是您要传递的字符串的新副本。begin_end_是迭代器中的...完全不同的字符串。因此,当您尝试使用erase时:

string_.erase(begin_, it);

您违反了begin_实际上是string_的迭代器的前提条件。

最新更新