代码之家  ›  专栏  ›  技术社区  ›  Calvin1602

std::swap返回0xBAADF00D

  •  1
  • Calvin1602  · 技术社区  · 14 年前

    我正在尝试交换两个std::list<dontcare*>::visual2005下的迭代器。

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

    感谢您的帮助:)

    好吧,是时候了。

    交换的it1是if作用域中的局部变量。

    F**king剪切粘贴。抱歉浪费你的时间:/

    3 回复  |  直到 14 年前
        1
  •  3
  •   Mark B    14 年前

    你是不是在你的电脑里漏掉了代码 if ? 很可能是你身体里的其他东西 检查,但交换之后实际上是使迭代器无效(可能是擦除)。

        2
  •  4
  •   sbi    14 年前

    #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
    

    如果它为您做了其他事情,那么您的编译器或标准库都将被破坏。

    如果它对您也这样做,那么错误就在您的代码和我的代码之间的某个地方。哪里,我们不知道,因为我们不知道你的密码。

        3
  •  0
  •   Jay    14 年前