std::string::erase 导致内存损坏

Posted

技术标签:

【中文标题】std::string::erase 导致内存损坏【英文标题】:std::string::erase causes memory corruption 【发布时间】:2018-04-01 15:22:26 【问题描述】:

我在这个错误上坐了 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;

【问题讨论】:

【参考方案1】:

仔细查看您的签名:

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

string_ 是一个值,是您传入的字符串的一个新副本。begin_end_ 是迭代器到...一个完全不同的字符串。所以当你尝试erase

string_.erase(begin_, it);

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

【讨论】:

以上是关于std::string::erase 导致内存损坏的主要内容,如果未能解决你的问题,请参考以下文章

libtorrent-rasterbar 和 QGuiApplication 导致内存损坏

为啥使用 STL std::vector 作为 __block 变量会导致内存损坏?

由于复制构造函数/删除数组导致内存损坏?

Linus 电脑内存损坏,导致 Linux 6.1 补丁合并推迟

malloc():内存损坏

手机优酷上下载的视频显示文件损坏怎么回事