我最近遇到了堆腐败的第一次战斗 (已解决).在我家的linux机器上,使用valgrind和电栅栏(使用gdb),罪魁祸首代码无错误地退出.然而,在我们实验室的Windows机器上,我始终从我引用的帖子中描述了VS中与堆损坏相关的错误消息.
valgrind和电围栏不会发现这样的问题,这是否令人惊讶(或至少不常见)?其他人提到了一个可能类似的错误,在这里回答了valgrind .这些工具无法检测到此问题的原因可能是什么?有没有理由怀疑错误实际上是堆腐败?
更新:正如在描述原始问题的帖子中所提到的,我发现问题是由于指向std :: vector中的元素指针,这变得很糟糕.用std :: list替换向量(添加新元素时指针不会变为无效)修复了问题.所以回到我关于为什么valgrind没有发现问题的问题,我问是否有关于如何避免将来出现类似情况的建议,即valgrind未检测到的内存问题,这是我的一个问题最喜欢的工具 显然,更好地了解STL如何工作将是一个好主意.也许我需要在编程等方面对断言更加自信.
我有以下课程:
Class L{
public:
bool foo(vector<bool> & data);
private:
C** cArray;
}
Run Code Online (Sandbox Code Playgroud)
并且想要在创建L的对象并初始化cArray中的所有元素之后,在函数foo中并行化for循环,该函数被称为somtime.
bool L::foo(vector<int> & data){
int row, col;
#pragma omp parallel shared(SIZE, cArray, data) private(row, col)
for (row=0, row<SIZE; ++row)
{
for (col=0; col<SIZE; ++col)
{
cArray[row][col].computeScore(data);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这会产生错误:错误C3028:'L :: cArray':只能在数据共享子句中使用变量或静态数据成员.
假设我不想让cArray静态,有什么可以做的吗?