所以我想要做的是編寫一個程序,它創建一系列子線程,它們使用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));
}
感謝您的幫助!
不是直接的解決方案,但可以爲您節省了不少麻煩:如果您使用C++ 11,請優先使用'std :: thread'。 – Aleph
看起來您正在將一個未初始化的指針插入矢量'reduce_args_'中,然後嘗試訪問它。 – Mgetz
如果應用程序在push_back中崩潰,這意味着實際問題與向量無關,但是由於您之前通過寫入另一個數組的邊界而導致堆損壞,在這種情況下,我們需要更多的代碼才能夠爲您指出正確的方向。這可能也是Mgetz說的 –