我有一个间歇性在长时间运行时因“访问冲突”而崩溃的程序。经过调试,我发现了一个非常奇怪的现象。
程序在一个代码上崩溃,该代码将一个std::vector
分配(复制)到另一个代码,如下所示:
struct Data
{
int int1;
int int2;
}
//vec1 is empty
//vec2 contains a couple of thousands Data structs
std::vector<struct Data> vec1 = vec2;//**crash happens here**
发生的事情很简单 - STL为vec1
分配一个内存块,并在那里复制来自vec2
的数据。分配顺利。当STL尝试使用来自vec1
的数据填充vec2
的新分配内存时,复制过程会发生崩溃。
更奇怪的是,该复制过程的某些部分已正确执行,并且崩溃发生在该过程的中间某处。
我的问题是 - 新分配的内存块如何“部分”不可写?谢谢。
编辑:大家好,我不是说这段代码有问题 - 当然不会。我问为什么这类代码会崩溃?即我的程序的其他部分如何修改STL新分配的内存块?如何调试此类内存损坏?
是的,这是真正的代码
补充:我已启用页面堆,以查看在执行此代码之前是否发生了问题。它没有抓到任何东西。
答案 0 :(得分:0)
好的,我发现原因是不正确的同步,即vec2
在初始化过程中vec1
从辅助线程修改。与原始帖子中的向量分配相对应的STL代码如下:
if (_Buy(_Right.size()))
_Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast, _Myfirst);
第一行为新向量分配内存,第二行为内容复制。
发生的事情是在完成第一行(并分配了内存)之后,从外部线程修改了向量并且其大小增加了。所以第二行试图复制比分配的内存大小更多的元素。这导致访问违规。