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

Access violation writing newly allocated memory

本文关键字:内存 访问冲突 新分配 分配      更新时间:2023-10-16

我有一个程序,当运行很长一段时间时,会间歇性地崩溃并出现"访问冲突"。调试后,我发现了一个非常奇怪的现象。

该程序在将一个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试图用vec2中的数据填充vec1新分配的内存时,复制过程中会发生崩溃。更奇怪的是,复制过程的某个部分被正确执行,而崩溃发生在该过程中间的某个地方。

我的问题是,一个新分配的内存块怎么可能"部分"不可写?非常感谢。

编辑:伙计们,我并不是说这个代码有问题——当然没有。我在问为什么这种类型的代码会崩溃?即,我程序的另一部分如何修改STL新分配的内存块?如何调试这种内存损坏

是的,这是真正的代码

附加:我启用了页面堆,以查看问题是否在执行此代码之前发生。它什么也没抓到。

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

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

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

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