2010-07-27 2 views
1

Я пытаюсь поменять два зЬй :: Список < dontcare *> :: итераторы под визуальным 2005станд :: своп возвращает 0xBAADF00D

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

Своп работает, но когда я оставить, если() scope, it1 указывает на 0xbaadfood. It2 в порядке. Я попробовал несколько вариантов, включая swap_iter и ручной обмен.

Любая помощь приветствуется :)

EDIT

Ok, так что время стыдно.

Помененный it1 был локальной переменной в области if.

F ** король cut'n приклеивание. Извините за то, что вы тратили свое время:/

+6

Не ешьте это. Это даст вам базуку sh! Ts. –

+8

Я думаю, нам понадобится еще немного кода. –

+1

Действительно ли вы меняете итераторы, которые определены вне области 'if', или вы обмениваетесь некоторыми итераторами, определенными внутри if? Определяется ли контейнер внутри 'if'? –

ответ

3

Вы опускаете код внутри своего if? Скорее всего, что-то еще в вашей проверке if, но после обмена фактически аннулирует итератор (возможно, стирает).

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 

для меня.

Если это что-то еще для вас, ваш компилятор или ваша стандартная библиотека сломаны.

Если он делает то же самое для вас, тогда ошибка находится где-то в разнице между вашим кодом и моим кодом. Где мы не можем знать, потому что мы не знаем ваш код.

0

WAG, но, возможно, swap создает новые объекты и копирует их (и копия недействительна, поскольку использует конструктор по умолчанию)?

+0

Простите меня по-французски, но это BS. Копирование использует конструкторы копирования (и 'std :: swap()' хорошо определен для всех типов, поддерживающих построение копии). – sbi

Смежные вопросы