Seg 由对 vector (线程 linux) push_back调用而导致的错误
Seg Fault resulting from push_back call on vector (threads linux)
所以我要做的是编写一个程序来创建一系列子线程,这些子线程使用 pthread_create 方法获取参数,并使用传入的参数进行更多操作等等。我尝试传入的参数是一个名为 reduce_args_ 的向量参数。这是结构 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;
现在,当我在这里打电话给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方法都会导致 SEG 错误。 洗牌集只是一个集合,正在输出字符串。 如 .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));
}
感谢您的帮助!!
这个:
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());
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 为什么对std::vector::back()的调用会使我的程序崩溃