std::string::erase 导致内存损坏
std::string::erase causes memory corruption
我在这个错误上等待了 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_
.
的迭代器
我在这个错误上等待了 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_
.