std :: swap возвращает 0xBAADF00D - PullRequest
1 голос
/ 27 июля 2010

Я пытаюсь поменять местами два std :: list :: iterators под Visual 2005.

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

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

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

РЕДАКТИРОВАТЬ

Хорошо, поэтому позор.1010 *

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

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

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Эта следующая программа

#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 голосов
/ 27 июля 2010

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

0 голосов
/ 27 июля 2010

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

...