写入新分配的内存时发生访问冲突
Access violation writing newly allocated 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试图用vec2
中的数据填充vec1
新分配的内存时,复制过程中会发生崩溃。更奇怪的是,复制过程的某个部分被正确执行,而崩溃发生在该过程中间的某个地方。
我的问题是,一个新分配的内存块怎么可能"部分"不可写?非常感谢。
编辑:伙计们,我并不是说这个代码有问题——当然没有。我在问为什么这种类型的代码会崩溃?即,我程序的另一部分如何修改STL新分配的内存块?如何调试这种内存损坏
是的,这是真正的代码
附加:我启用了页面堆,以查看问题是否在执行此代码之前发生。它什么也没抓到。
OK我发现原因是同步不正确,即vec2
是在vec1
初始化过程中从辅助线程修改的。与原始帖子中的矢量分配相对应的STL代码如下:
if (_Buy(_Right.size()))
_Mylast = _Ucopy(_Right._Myfirst, _Right._Mylast, _Myfirst);
第一行为新矢量分配内存,第二行复制内容。
发生的事情是在第一行完成(并分配内存)后,从外部线程修改向量,并增加其大小。因此,第二行试图复制比分配的内存大小更多的元素。这导致了访问违规。
相关文章:
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++中的内存分配(引发异常:读取访问冲突)
- 使用加速进程间创建消息队列 - 内存访问冲突
- C 指针转换会导致内存访问冲突
- 为什么创建进程 API 调用会导致内存访问冲突?
- 使用 std::map 作为本地成员的内存访问冲突
- 编译哈希算法时出现内存访问冲突错误
- 使用内存访问冲突错误
- 堆栈引发内存访问冲突
- 使用 Boost::序列化时内存访问冲突
- 调用std::vector::empty()时内存访问冲突读取位置
- 基于 SAPI 的应用程序在枚举令牌时引发内存访问冲突
- 内存访问冲突
- 使用 VC++ 中的 Try 和 catch 块捕获内存访问冲突
- 对象向量中的内存访问冲突
- "detects_simple_anagram"中的致命错误:地址 0x00000000 处的内存访问冲突:故障地址处没有映射
- 内存访问冲突插入结构在树结构c++
- c++内存访问冲突
- MotorBee dll和c++,内存访问冲突
- 调用FindConnectionPoint时写入内存访问冲突