【发布时间】:2016-11-21 14:13:13
【问题描述】:
在 Visual Studio 2013 中,我创建了一个 std::vector 并在其中存储了一些字符串。然后我想在向量中复制一些字符串并将它们附加到末尾(假设将它们移动到末尾,插入后会擦除),但是使用插入方法,我在末尾只看到了空字符串,非常奇怪的。我用一些简单的测试代码重现了它,
std::vector<std::string> v;
std::string s = "0";
for (int i = 0; i < 7; ++i)
{
s[0] = '0' + i;
v.push_back(s);
}
v.insert(v.end(), v.begin(), v.begin() + 3);
for (std::string& s : v)
std::cout << "\"" << s.c_str() << "\" ";
我得到的是 “0”“1”“2”“3”“4”“5”“6”“”“”“”
我调试了insert方法,在vector类的_Insert(..)方法里面,做了一些内存的重新分配,内存的移动/移动等等。
第一个 _Umove 调用将所有 7 个字符串移动到新分配的内存,我认为调用了 std::move,旧内存留下了一些空字符串。
然后 _Ucopy 方法尝试复制 3 个项目,但从旧内存中,结果附加了 3 个空字符串。 还有另一个 _Umove 电话,我不知道那是为了什么。毕竟,旧的内存被释放,新的内存被附加到向量上。
使用像 int 这样的标量类型不会产生错误的输出,因为内存被复制,没有调用 std::move。
我在这里做错了什么,还是 MS Visual Studio 的 STL 错误?
【问题讨论】:
标签: c++11 stl stdvector stdstring