-4

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

该程序在将一个分配(复制)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新分配的内存块?以及如何调试这种内存损坏?

是的,这是真正的代码

补充:我已经启用页堆来查看问题是否发生在这段代码执行之前。它什么也没抓住。

4

1 回答 1

0

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

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

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

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

于 2013-02-17T17:40:25.250 回答