STL堆栈:读取访问冲突
STL Stack: read access violation
我创建了一个堆栈,然后使用memcpy将堆栈复制到缓冲区。稍后我尝试使用缓冲区创建堆栈对象。但我收到了读取访问违规。
请参阅下面的代码,它可能会更好地解释这种情况。
Byte *targetdata;
class DATA
{
std::stack<int> scatter;
}data;
...
...
memcpy(targetdata, &data, sizeof(DATA));
...
...
{
DATA data2;
memcpy(&data2, targetdata, sizeof(DATA));
}// Get a read access violation here.
您不应将memcpy
与POD("普通旧对象",即可能包含其他POD或仅包含int
等普通类型的结构)以外的任何对象一起使用,因为结构可能比一堆字节更复杂。有关详细信息,您可能会看到此问题。
在您的情况下,stack<>
在内部保存一个指针,指向保存实际数据的一段内存(甚至几段内存)。创建stack<>
时,将分配该内存。当stack<>
被破坏时(即变量不再可见,通常发生在}
),该内存块被释放。如果之后尝试访问它,则会得到未定义的行为。如果你(或其他人)事后试图破坏它,这也是一种未定义的行为,称为"双重自由"。
所以,很可能你有双重自由或类似的未定义行为。请注意,细节在很大程度上取决于stack<>
的确切实现。
在C++中,应该使用=
来分配复杂结构:
stack<int> a;
// Fill up `a`.
stack<int> b;
b = a;
// Now `a` and `b` are independent stacks with same content.
这也应该在没有额外负担的情况下使用您的结构。对于更复杂的结构,应用三条规则。
相关文章:
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 0x0F50DF58:0xC0000005:访问冲突读取位置0x0047CA04时未处理的异常
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 0xC0000005:访问冲突读取位置0x0000000000000008
- C++访问冲突读取位置0xDDDDDDCD当我尝试删除已更新的数组时
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- vc++ 访问冲突读取位置
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- C++访问冲突读取位置错误
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- 0xC0000005:访问冲突读取位置0x0000000000000000.C++
- 在 DirectXGame.exe 中0x00B84CD6出现未经处理的异常:0xC0000005:访问冲突读取位置0x
- 存储类对象的C++模板链表-未处理的异常访问冲突读取位置
- 获取访问冲突读取位置0x000000b0与 glutMouseFunc
- C++访问冲突读取位置
- 无法修复访问冲突读取位置错误
- Dijkstra 中0x001e1078 s_Algorithm.exe的未处理异常:0xC0000005:访问冲突读取位置0xbaadf00d
- 0xC0000005:访问冲突读取位置0x00000000哈希函数
- 访问冲突读取位置0x00000002