vector.insert()导致内存损坏 我对C++没有经验,所以我可能会忽略一些明显的东西。 我知道vector.insert存在“无效迭代器”问题,但我不知道在这种情况下会发生什么。 也有一些OpenMP涉及,但插入本身被放置在并行块之外 void doWork(vector<Solution> &sol) { vector<Solution> partial[40]; #pragma omp parallel for ... shared(partial) ... for (...) { ... partial[tid].push_back(Solution(i,j)); ... } for (i = 0; i < 40; i++) sol.insert(sol.end(), partial[i].begin(), partial[i].end()); } void doWork(向量和sol) { 向量部分[40]; #pragma omp并行用于…共享(部分)。。。 对于(…){ ... 部分[tid]。推回(溶液(i,j)); ... } 对于(i=0;i

vector.insert()导致内存损坏 我对C++没有经验,所以我可能会忽略一些明显的东西。 我知道vector.insert存在“无效迭代器”问题,但我不知道在这种情况下会发生什么。 也有一些OpenMP涉及,但插入本身被放置在并行块之外 void doWork(vector<Solution> &sol) { vector<Solution> partial[40]; #pragma omp parallel for ... shared(partial) ... for (...) { ... partial[tid].push_back(Solution(i,j)); ... } for (i = 0; i < 40; i++) sol.insert(sol.end(), partial[i].begin(), partial[i].end()); } void doWork(向量和sol) { 向量部分[40]; #pragma omp并行用于…共享(部分)。。。 对于(…){ ... 部分[tid]。推回(溶液(i,j)); ... } 对于(i=0;i,c++,vector,memory-corruption,C++,Vector,Memory Corruption,编辑: 错误消息是std bad alloc。 我确信没有超过40个线程。显然,即使只有一个线程,这种情况也会发生(开和关)。 更有趣的是,另一种解决方案: for(i = 0; i < 40; i++) for(j = 0; j < partial[i].size(); j++) sol.push_back(partial[i][j]); (i=0;i

编辑: 错误消息是std bad alloc。 我确信没有超过40个线程。显然,即使只有一个线程,这种情况也会发生(开和关)。 更有趣的是,另一种解决方案:

for(i = 0; i < 40; i++)
    for(j = 0; j < partial[i].size(); j++)
        sol.push_back(partial[i][j]);
(i=0;i<40;i++)的

对于(j=0;j

似乎在不同数量的线程上始终有效。

结束后(在最后一个线程之前的行中)缺少()。这有关系吗?你怎么知道你有内存损坏?你有什么错误?有时,内存错误出现在与根本原因不同的位置。通常,内存损坏不会发生在注意到的地方——损坏发生得更早,但在您尝试以某种方式使用损坏的内存之前,您不会看到问题。您确定线程数不超过40个吗?(您应该使用向量向量,以便动态调整线程数)您确定没有两个线程在同一向量上执行
push_-back
吗?
std::vector
是否具有足够的锁定,可以从
pragma omp parallel
指令调用
push_-back
?Afayk No,这可能有很长的路来解释任何后续错误。@ MiHiopeRe-“看起来工作一贯精细”证明没有任何正确性或其他方面的C++程序。