2013-10-21 68 views
1

所以我想要做的是編寫一個程序,它創建一系列子線程,它們使用pthread_create方法接受參數並使用傳入的參數來執行更多的操縱等等。我試圖傳入的參數是一個名爲reduce_args_的向量參數。這是結構ReduceVector的頭信息。因向量push_back調用導致Seg錯誤(線程linux)

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; 

現在的問題是當我的push_back這裏呼籲:

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; 
    } 
} 
的這兩個方法的push_back導致

一個賽格故障。隨機設置只是一個集合,正在輸出字符串。如.h文件中所述,files_to_reduce是一個字符串向量。所以我想要做的是訪問files_to_reduce和push_back一個字符串,但每次我都會遇到seg錯誤。 reduce_args_ obj聲明如下:

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)); 
    } 

感謝您的幫助!

+0

不是直接的解決方案,但可以爲您節省了不少麻煩:如果您使用C++ 11,請優先使用'std :: thread'。 – Aleph

+0

看起來您正在將一個未初始化的指針插入矢量'reduce_args_'中,然後嘗試訪問它。 – Mgetz

+0

如果應用程序在push_back中崩潰,這意味着實際問題與向量無關,但是由於您之前通過寫入另一個數組的邊界而導致堆損壞,在這種情況下,我們需要更多的代碼才能夠爲您指出正確的方向。這可能也是Mgetz說的 –

回答

4

此:

ReduceArg* plhold; 
reduce_args_.push_back(plhold); 

除非你已經隱藏了一些重要的代碼,你推一個未初始化的指針,因此下一行將會導致混亂。

可能你的意思是?

ReduceArg* plhold(new ReduceArg); 

..但我懷疑你沒有正確想過對象的壽命和其地址要存儲在矢量對象的所有權。

一般而言,避免指針,除非你知道正好你在做什麼,以及爲什麼。作爲發佈的代碼並不需要他們,我會建議你只需要使用這樣的事情:

typedef vector<ReduceArg> ReduceVector; 

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

@MGetz是的,但是:從發佈的代碼開始,很難知道從哪裏開始。我的猜測是,他不應該首先存儲指針。 – Roddy

+0

我建議使用[unique_ptr](http://en.cppreference.com/w/cpp/memory/unique_ptr),聲明'typedef vector > ReduceVector;'如果指針是必需的。 – Steve

+0

@Steve可能。坦率地說,這全是猜測:-( – Roddy