2016-04-04 30 views
1

コメントを見て、コードを見てエラーが見つかりました。逆参照できないベクトル

私がこのエラーに直面してしまったいくつかの工夫の後に思える:

Debug error: vector iterator is not dereferencable.

私はそれがassingthreads内部のベクトルであることを100%確信しています。

これはエラーを生成します新しく追加されたコードです:for -loop、it = partVec.end()

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

まあまあです。私がやることのすべてが何らかの誤りでうまくいくように見えるので、今は私が基本的に謝罪しているので、今私は手を差し伸べています。 – geostocker

+0

小さくしてください。コードの小さなサブセットを実行しているあなたの 'main'から。 [最小、完全、検証可能、例](http://stackoverflow.com/help/mcve)の作成方法を理解するために他の質問をする必要があるかもしれません。それについてストレスを感じないでください、それはすべての学習です。 –

答えて

1

あなたの最初の時間。定義により

あなたがvectorend間接参照することはできませんが、お電話:

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

あなたはおそらく意図forループは、このようなrbeginrendを逆イテレータを使用:

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

カップルの追加メモ:

  1. は、参照することによって、あなたのvectorを渡しますvoid assignthreads(std::vector<std::vector<std::wstring>>& partVec, const string& symbol)
  2. あなたはthreadspartVecと同じサイズであることを確認する必要があります。だから、どちらかの操作を行います。vector<thread> threads(size(partVec))threads後には定義されています:assignthreadsforループとassert(size(threads) == size(partVec))
+0

これは、はるかに役立っています。 あなたは時間があれば、私が答えを受け入れる前に編集を見てもらえますか(もちろん私はあなたの答えを受け入れます!)! ありがとう、男! :) – geostocker

+0

@geostocker喜んでお手伝いします。私の答えを受け入れるために急いでする必要はありません、誰がそこに後で来るより良いものがあるかもしれないことを知っています。しかし、編集でこれを行うことができます。この質問から削除して新しい質問を開くことはできますか?あなたがそうして、ここでリンクを使ってコメントしたら、その質問に答えようとします。要するに、これらの質問が他の人に役立つようにすることであり、質問がどんなものか分かりにくい場合は、あきらめて新しい質問を探すことになります。 –

+0

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

1

少なくとも一つの問題は、ベクトルのend()逆参照しようとしていることです。

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

ループの最初の繰り返しでは、これは未定義です。デバッガはあなたにそれを伝えるだけです。あなたは、ループを「逆転」したい

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

サイドノート一般的に反復しながらコンテナを変更することをお勧めされていません(rbegin()rend()経由で利用可能)コンテナのreverse_iteratorを使用する場合は

それを介して(partVec.pop_back();を介して)。 vectorから削除されたもので何もしないように思われるので、内容を繰り返し処理したほうがよいかもしれません。std::vector<>::clear()を呼び出すと、ループの後にベクターからすべての内容が削除されます。

関連する問題