Seg-Fault, die aus push_back Aufruf auf dem Vektor (threads linux)

Also, was ich versuche zu tun, ist schreiben Sie ein Programm, das erstellt eine Reihe von untergeordneten threads, die nehmen die Argumente, die mit dem pthread_create-Methode und verwendet die parameter, um mehr tun, manipulation und so weiter. Die parameter, die ich bin versucht zu übergeben, ist ein Vektor-argument genannt reduce_args_. dies ist die header-information für die Struktur ReduceVector.

typedef vector<string> StringVector;

//a data structure to maintain info for the reduce task
struct ReduceArg
{
  ReduceArg (void);  //constructor
  ~ReduceArg (void); //destructor

  pthread_t tid;  //thread id of the reduce thread
  StringVector files_to_reduce; //set of files for reduce task
};

//more typedefs
typedef vector<ReduceArg *> ReduceVector;

jetzt die Fragen kommt, wenn ich rufe push_back hier:

for(int i = 0; i < num_reduce_threads_ ; i++){
            reduce_args_.push_back(phold);
        int count = 0;
        for(ShuffleSet::iterator it = shuffle_set_.begin(); it!=shuffle_set_.end(); ++it){
            string line = *it;
            string space = " ";
            string file = line.substr(0, line.find(space)) + ".txt";

            if (count < num_reduce_threads_){
                cout << reduce_args_[i+1];
                (reduce_args_[i+1] -> files_to_reduce)[count] = file;
                            //(reduce_args_[i+1] -> files_to_reduce).push_back(file);
             }
             count++;
            //cout << ((reduce_args_.back())->files_to_reduce).back()<< endl;
    }
}

diese beiden Methoden push_back verursachen einen seg fault. die shuffle-set ist eben ein set und ist die Ausgabe von strings. und wie bereits in der .h-Datei, die files_to_reduce ist ein string-Vektor. Also, was ich versuche zu tun, ist der Zugang der files_to_reduce und push_back einen string auf, aber jedes mal bekomme ich einen seg fault. Die reduce_args_ obj deklariert, wie unten:

ReduceArg* plhold;
    reduce_args_.push_back(plhold);
    ((reduce_args_.back()) -> files_to_reduce).push_back("hello");
    for (int i = 0; i < this->num_reduce_threads_; ++i) {
      //create a placeholder reduce argument and store it in our vector
      (reduce_args_.push_back(plhold));
    }

danke für die Hilfe!!

Nicht eine direkte Lösung aber könnte sparen Sie eine Menge ärger: Wenn Sie C++11, bitte lieber std::thread.
Sieht aus wie Sie schieben einen nicht initialisierten Zeiger in den Vektor reduce_args_ dann versucht, darauf zugreifen.
wenn die Anwendung abstürzt, die in push_back es bedeutet, dass das eigentliche problem hat nichts zu tun mit dem Vektor, aber mit einer heap-Beschädigung, die Sie früher durch das schreiben über einen anderen arrays' Grenzen, in diesem Fall würden wir brauchen mehr code in der Lage sein, um Sie in die richtige Richtung. Es könnte auch sein, was Mgetz sagt
Viele störende Klammern übrigens: schreiben Sie Einfach reduce_args_.back()->files_to_reduce.push_back("hello");
im Grunde haben Sie Jungs hatten Recht, ich habe vergessen Sie zu initialisieren, und als Folge wurde der Zugriff auf undefinierten Speicher außerhalb der Grenzen. Dann musste ich verschieben, dass die Initialisierung-Anweisung innerhalb der Schleife. Danke!

InformationsquelleAutor Michael Nakayama | 2013-10-21

Schreibe einen Kommentar