2016-04-04 2 views
1

После просмотра комментариев я просмотрел код и обнаружил ошибку.Vector not dereferencable

Кажется, после того, как какой-то мастерить я получил столкнулся с этой ошибкой:

Debug error: vector iterator is not dereferencable.

Я 100% уверен, что он находится в векторе внутри assingthreads.

Это недавно добавленный код, который порождает ошибку:

void historical::writeData(std::vector<std::vector<std::wstring>> in, const string& symbol) { 
     std::cout << "Sending data to database connector" << std::endl; 
     std::vector<std::vector<std::wstring>> temp; 

     while (!in.empty()) { 
      for (int i = 0; i < 5; i++) { 
       temp.push_back(in.back()); 
       in.pop_back(); 
      } 
      assignthreads(temp, symbol); 
      temp.clear(); 
     } 

    } 
    void historical::assignthreads(std::vector<std::vector<std::wstring>> partVec, const string& symbol) { 
     int i = 0; 
     std::thread threads[5]; 
     std::vector<std::vector<std::wstring>>::iterator it; 
     for (it = partVec.end(); 
      it != partVec.begin(); 
      it--) { 
      std::shared_ptr<database_con> sh_ptr(new database_con); 
      threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol); 
      partVec.pop_back(); 
      i++; 
     } 
     for (auto& th : threads) th.join(); 

    } 
+0

Извините, что проголосовали за закрытие первого вопроса, но, как я уверен, вы видели из других хорошо полученных вопросов, на которые вы обращались, http://www.stackoverflow.com не является служба отладки. Мы не принимаем программы и не выплеснем, как их исправить. Мы здесь, чтобы помочь понять. В качестве программиста вы найдете строку, которая разбивается, затем укажите [Минимальный, полный, проверенный пример] (http://stackoverflow.com/help/mcve) сбоя из этой строки. (Часто процесс создания указанного примера достаточно для решения этой проблемы для вас.) Но если не сообщение, и вы получите помощь. –

+0

Абсолютно отлично. Прямо сейчас я общаюсь с тех пор, как я в основном иду apeshit, потому что все, что я делаю, похоже, что-то вроде ошибки. – geostocker

+0

Начать небольшой. Из вашего 'main' просто запускается крошечное подмножество кода. Вы можете даже задать другие вопросы, чтобы выяснить, как создать [Минимальный, Полный, Подтверждаемый, Пример] (http://stackoverflow.com/help/mcve). Не беспокойтесь об этом, это все учится. –

ответ

1

Ваш первый раз через for -loop, it = partVec.end().

По определению вы не можете разыменовать end из vector но вы звоните:

threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol); 

for петли вы хотели, вероятно, использовали обратные итераторы, rbegin и rend так:

for(auto it = rbegin(partVec); it != rend(partVec); ++it) 

Дополнительная информация:

  1. Пройди свой vector по ссылке: void assignthreads(std::vector<std::vector<std::wstring>>& partVec, const string& symbol)
  2. Вы должны подтвердить, что threads имеет такой же размер, как partVec. Так что либо делать: vector<thread> threads(size(partVec)) или после threads определяется сделать: assert(size(threads) == size(partVec))
+0

Это, безусловно, было самым полезным. Не возражаете, если у вас есть время, чтобы посмотреть на редактирование, прежде чем я приму ответ (конечно, я все равно буду принимать ваш ответ!)! Спасибо, мужик! :) – geostocker

+0

@geostocker Счастливые помочь. Не нужно спешить, чтобы принять мой ответ, хотя, кто знает, что может быть лучше, который приходит позже сегодня. Но давайте сделаем это на редактировании, вы можете просто удалить его из этого вопроса и открыть новый вопрос? Если вы это сделаете, и вы прокомментируете ссылку здесь, я попытаюсь ответить на этот вопрос. Дело в том, что мы хотим, чтобы эти вопросы были полезны для других людей, и если вопросы становятся настолько сложными, что они не могут понять, что просят, они откажутся и перейдут к поиску нового вопроса. –

+0

http://stackoverflow.com/questions/36403742/seemingly-empty-vector – geostocker

1

По крайней мере, один вопрос с for цикла в assignthreads является то, что вы пытаетесь разыменовать end() вектора;

for (it = partVec.end(); it != partVec.begin(); it--) { 
    // ... 
    threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol); 
    //             ^^^^ 
} 

И на первой итерации цикла это не определено; ваш отладчик просто говорит вам об этом.

Если вы хотите, чтобы «обратный» через петлю, используйте reverse_iterator контейнера (доступный через rbegin() и rend())

for (it = partVec.rbegin(); it != partVec.rend(); ++it) 

Примечание стороны это, как правило, не рекомендуется изменять контейнер в то время как итерация через него (через partVec.pop_back();). Поскольку вы, похоже, ничего не делаете с тем, что удалено из vector, может быть лучше также перебрать содержимое, а затем вызвать std::vector<>::clear(), чтобы удалить все содержимое из вектора после цикла.

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