c++ - std::string::erase 导致内存损坏

标签 c++ string algorithm trim erase

我在这个错误上等待了 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_ 是迭代器...一个完全不同的字符串。因此,当您尝试删除时:

string_.erase(begin_, it);

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

关于c++ - std::string::erase 导致内存损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49599560/

相关文章:

arrays - 在二维数组中分配一组数字而不相邻的算法

algorithm - 找到所有可能的数字集的最大值和最小值之间的最小差异

c++ - 将 vector 输出到文件中

c++ - std::function 和 std::bind 做动态内存分配吗?

c++ - 我在哪里可以找到 string.cpp 的来源

java - LinkedBinaryTree<E> 类的 toString() 方法

c++ - 为什么允许嵌套类模板的部分特化,而不允许完全特化?

java - Android 中的字符串不具有相同的值

Swift String Range - 有没有更简单的方法来定义字符串范围?

javascript - 在网格中分组矩形