gpt4 book ai didi

c++ - vector 上的 push_back 调用导致的段错误(线程 linux)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:54 28 4
gpt4 key购买 nike

所以我想做的是编写一个程序来创建一系列子线程,这些子线程使用 pthread_create 方法获取参数并使用传入的参数进行更多操作等等。我试图传入的参数是一个名为 reduce_args_ 的 vector 参数。这是结构 ReduceVector 的 header 信息。

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 是一个字符串 vector 。所以我想做的是访问 files_to_reduce 和 push_back 一个字符串到它上面,但每次我都遇到段错误。 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);

..但我怀疑您没有正确考虑对象的生命周期和您将其地址存储在 vector 中的对象的所有权。

一般来说,除非您完全知道自己在做什么以及为什么,否则请避免使用指针。发布的代码不需要它们,我建议您只使用这样的代码:

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

关于c++ - vector 上的 push_back 调用导致的段错误(线程 linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19502228/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com