在查看了我看过代码的评论后发现了一个错误。
似乎经过一些修补我遇到了这个错误:
调试错误:向量迭代器不可解除引用。
我100%确定它在assingthreads中的向量中。
这是产生错误的新添加的代码:
void historical::writeData(std::vector<std::vector<std::wstring>> in, const string& symbol) {
std::cout << "Sending data to database connector" << std::endl;
std::vector<std::vector<std::wstring>> temp;
while (!in.empty()) {
for (int i = 0; i < 5; i++) {
temp.push_back(in.back());
in.pop_back();
}
assignthreads(temp, symbol);
temp.clear();
}
}
void historical::assignthreads(std::vector<std::vector<std::wstring>> partVec, const string& symbol) {
int i = 0;
std::thread threads[5];
std::vector<std::vector<std::wstring>>::iterator it;
for (it = partVec.end();
it != partVec.begin();
it--) {
std::shared_ptr<database_con> sh_ptr(new database_con);
threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol);
partVec.pop_back();
i++;
}
for (auto& th : threads) th.join();
}
答案 0 :(得分:1)
您第一次通过for
- 循环,it = partVec.end()
。
根据定义,您无法取消引用end
的{{1}},但请致电:
vector
您想要的threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol);
循环可能使用反向迭代器,rbegin
和rend
,如下所示:
for
另外几点说明:
for(auto it = rbegin(partVec); it != rend(partVec); ++it)
:vector
void assignthreads(std::vector<std::vector<std::wstring>>& partVec, const string& symbol)
与threads
的大小相同。因此:partVec
或vector<thread> threads(size(partVec))
定义后执行:threads
答案 1 :(得分:1)
for
中assignthreads
循环的至少一个问题是您尝试取消引用该向量的end()
;
for (it = partVec.end(); it != partVec.begin(); it--) {
// ...
threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol);
// ^^^^
}
在循环的第一次迭代中,这是未定义的;你的调试器只是告诉你。
如果您想在循环中“反向”,请使用容器的reverse_iterator
(可通过rbegin()
和rend()
获得)
for (it = partVec.rbegin(); it != partVec.rend(); ++it)
旁注通常不建议在迭代过程中修改容器(通过partVec.pop_back();
)。由于您似乎没有对从vector
中删除的内容执行任何操作,因此迭代内容可能更好,然后调用std::vector<>::clear()
以从矢量中删除所有内容循环之后。