STL堆栈:读取访问冲突

STL Stack: read access violation

本文关键字:访问冲突 读取 堆栈 STL      更新时间:2023-10-16

我创建了一个堆栈,然后使用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.

这也应该在没有额外负担的情况下使用您的结构。对于更复杂的结构,应用三条规则。