我的問題很簡單。我有一個值的向量(線程在這裏,無關),我想遍歷它們。然而,有兩個版本的代碼看起來是一樣的,但只有第二個代碼可以工作。我想知道爲什麼。用括號括起來的C++解引用(帶迭代器)
版本1(不編譯)
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
*it->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
2版(沒有工作)
int main(){
int someValue = 5;
vector<std::thread *> threadVector;
threadVector.resize(20);
for (int i = 0; i < 20; i++) {
threadVector[i] = new std::thread(foo, std::ref(someValue));
}
for (std::vector<std::thread *>::iterator it = threadVector.begin(); it != threadVector.end(); ++it) {
(*it)->join(); // *********Notice this Line*********
}
system("pause"); // I know I shouldn't be using this
}
不僅使用'system(「pause」)'有問題,而且知道並且仍然發佈這個不相關的代碼留下了改進的餘地。 ;)這就是說,我認爲std :: thread是可移動的,因此可以存儲在一個容器中(比如早期的boost :: thread)。我可能會誤解,因爲我還沒有玩過C++ 11。 –
那麼你能解釋一下將它們存儲在一個向量中有什麼問題嗎?我的意思是我可以聲明一個unique_ptr,然後std :: move到vector中,但這與新聲明有什麼不同? – JohnJohn
我所建議的根本不是使用指針和動態分配,而是針對所有異常安全問題以及此類其他開銷。同樣,你不會使用「vector」,而是使用「vector 」,或者?不過,我不確定你是否真的可以避免這種情況。 –