矢量不是dereferencable

时间:2016-04-04 10:40:25

标签: c++ multithreading visual-studio

在查看了我看过代码的评论后发现了一个错误。

似乎经过一些修补我遇到了这个错误:

  

调试错误:向量迭代器不可解除引用。

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

    }

2 个答案:

答案 0 :(得分:1)

您第一次通过for - 循环,it = partVec.end()

根据定义,您无法取消引用end的{​​{1}},但请致电:

vector

您想要的threads[i] = std::thread(&database_con::start, sh_ptr, *it, symbol); 循环可能使用反向迭代器,rbeginrend,如下所示:

for

另外几点说明:

  1. 通过引用传递您的for(auto it = rbegin(partVec); it != rend(partVec); ++it) vector
  2. 您需要验证void assignthreads(std::vector<std::vector<std::wstring>>& partVec, const string& symbol)threads的大小相同。因此:partVecvector<thread> threads(size(partVec))定义后执行:threads

答案 1 :(得分:1)

forassignthreads循环的至少一个问题是您尝试取消引用该向量的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()以从矢量中删除所有内容循环之后。