std :: swap返回0xBAADF00D

时间:2010-07-27 17:08:26

标签: c++ list iterator swap

我正在尝试交换两个std :: list<在Visual 2005下的dontcare *> :: iterators。

Iter it1 = ... ,it2 = ...; // it1 and it2 are ok, not end() or such
if(...){
    std::swap(it1,it2);
}

交换有效,但是当我离开if()范围时,it1指向0xbaadfood。 It2还可以。我尝试了几种变体,包括swap_iter和手工交换。

任何帮助表示赞赏:)

修改

好的,非常羞耻。

交换的it1是if范围内的局部变量。

F **王cut'n粘贴。抱歉浪费你的时间:/

3 个答案:

答案 0 :(得分:4)

以下计划

#include <iostream>
#include <vector>
#include <algorithm>

int main(){
    std::vector<int> v;
    for(std::vector<int>::size_type idx=0; idx<10; ++idx)
        v.push_back(static_cast<int>(idx));

    std::vector<int>::iterator it1 = v.begin();
    std::vector<int>::iterator it2 = v.begin() + v.size()/2;

    std::cout << static_cast<void*>(&*it1) << ':'  << *it1
              << ' ' << static_cast<void*>(&*it2) << ':'  << *it2 << '\n';
    std::swap(it1,it2);
    std::cout << static_cast<void*>(&*it1) << ':'  << *it1
               << ' ' << static_cast<void*>(&*it2) << ':'  << *it2 << '\n';

    return 0;
}

编译,运行,并按预期打印

00032A28:0 00032A3C:5
00032A3C:5 00032A28:0

对我来说。

如果它为您做了其他事情,您的编译器或标准库都会损坏。

如果它对你做同样的事情,那么错误就是你的代码和我的代码之间的差异。在哪里,我们无法知道,因为我们不知道你的代码。

答案 1 :(得分:3)

您在if内省略了代码吗?很可能是if检查中的其他内容,但在交换之后实际上使迭代器无效(可能是擦除)。

答案 2 :(得分:0)

WAG但是也许交换是构造新对象并复制它们(并且副本无效,因为它使用默认构造函数)?