2016-04-04 4 views
1

Nachdem ich mir die Kommentare angesehen habe, habe ich den Code durchgesehen und einen Fehler gefunden.Vector nicht dereferenzierbar

Es scheint nach einiger Bastelei ich mit diesem Fehler konfrontiert wurde:

Debug error: vector iterator is not dereferencable.

ich 100% sicher bin, dass es in dem Vektor innerhalb assingthreads ist.

Dies ist der neu hinzugefügten Code, der den Fehler laicht:

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

Es tut mir leid, derjenige sein zu wählen, um Ihre erste Frage zu schließen, aber wie Sie sicher von den anderen gut erhaltenen Fragen gesehen haben, die Sie angeschaut haben, http://www.stackoverflow.com ist kein Debugging-Dienst. Wir nehmen keine Programme auf und spucken aus, wie man sie repariert. Wir sind hier, um beim Verstehen zu helfen. Wenn der Programmierer die abstürzende Linie findet, geben Sie das [Minimale, vollständige, überprüfbare Beispiel] (http://stackoverflow.com/help/mcve) eines Absturzes von dieser Linie ein. (Oft ist der Prozess des Erstellens dieses Beispiels ausreichend, um diesen Fehler für Sie zu lösen.Aber wenn nicht, dann bekommst du Hilfe. –

+0

Absolut gut. Im Moment erreiche ich, da ich im Grunde genommen Apeshit mache, weil alles, was ich tue, in irgendeiner Art von Fehler aufsteigt. – geostocker

+0

Beginnen Sie klein. Von Ihrem 'main' läuft nur eine kleine Teilmenge des Codes. Möglicherweise müssen Sie noch andere Fragen stellen, um herauszufinden, wie Sie das [Minimal, Complete, Verifable, Example] (http://stackoverflow.com/help/mcve) erstellen können. Nicht darüber stressen, es ist alles Lernen. –

Antwort

1

Ihr erstes Mal durch die for -loop, it = partVec.end().

Per Definition kann man nicht dereferenzieren die end eines vector, aber sie rufen:

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

Die for Schleife soll Sie wahrscheinlich verwendet Reverse-Iteratoren, rbegin und rend wie folgt aus:

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

Ein paar zusätzliche Hinweise:

  1. Fahren Sie mit vector durch Verweis: void assignthreads(std::vector<std::vector<std::wstring>>& partVec, const string& symbol)
  2. Sie müssen bestätigen, dass threads die gleiche Größe wie partVec ist. Also entweder tun: vector<thread> threads(size(partVec)) oder nach threads definiert ist zu tun: assert(size(threads) == size(partVec))
+0

Dies war bei weitem am hilfreichsten. Hätten Sie etwas dagegen, wenn Sie Zeit haben, um die Bearbeitung zu sehen, bevor ich die Antwort akzeptiere (natürlich werde ich Ihre Antwort immer noch akzeptieren!)! Danke, Mann! :) – geostocker

+0

@geostocker Glücklich zu helfen. Ich brauche keine Eile, um meine Antwort zu akzeptieren, wer weiß, dass es vielleicht eine bessere gibt, die später kommt. Aber machen wir das beim Editieren, können Sie es einfach aus dieser Frage entfernen und eine neue Frage öffnen? Wenn Sie dies tun und Sie den Link hier kommentieren, werde ich versuchen, diese Frage zu beantworten. Der Punkt ist, dass wir wollen, dass diese Fragen für andere Menschen hilfreich sind, und wenn die Fragen so komplex werden, dass sie nicht herausfinden können, was sie gefragt werden, geben sie auf und suchen nach einer neuen Frage. –

+0

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

1

Mindestens ein Problem mit der for Schleife in assignthreads ist, dass Sie zu dereferenzieren der end() des Vektors versuchen;

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

Und auf der ersten Iteration der Schleife ist dies undefiniert; Ihr Debugger sagt Ihnen das nur.

Wenn Sie durch die Schleife auf „rückwärts“, verwenden Sie die reverse_iterator des Behälters (erhältlich über rbegin() und rend())

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

Exkurs es in der Regel nicht den Behälter geraten zu ändern, während Iterieren (über partVec.pop_back();). Da Sie nichts mit dem zu tun scheinen, was aus der vector entfernt wurde, kann es genauso gut sein, über den Inhalt zu iterieren und dann std::vector<>::clear() aufzurufen, um den gesamten Inhalt nach der Schleife aus dem Vektor zu entfernen.