访问冲突写入新分配的内存

时间:2013-02-17 12:58:11

标签: c++ windows memory

我有一个间歇性长时间运行时因“访问冲突”而崩溃的程序。经过调试,我发现了一个非常奇怪的现象。

程序在一个代码上崩溃,该代码将一个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新分配的内存块?如何调试此类内存损坏?

是的,这是真正的代码

补充:我已启用页面堆,以查看在执行此代码之前是否发生了问题。它没有抓到任何东西。

1 个答案:

答案 0 :(得分:0)

好的,我发现原因是不正确的同步,即vec2在初始化过程中vec1从辅助线程修改。与原始帖子中的向量分配相对应的STL代码如下:

if (_Buy(_Right.size())) 
    _Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast, _Myfirst);

第一行为新向量分配内存,第二行为内容复制。

发生的事情是在完成第一行(并分配了内存)之后,从外部线程修改了向量并且其大小增加了。所以第二行试图复制比分配的内存大小更多的元素。这导致访问违规。