STL堆栈:读取访问冲突

时间:2017-02-02 07:53:37

标签: c++ stl

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

1 个答案:

答案 0 :(得分:1)

你不应该将memcpy用于除POD之外的任何东西(&#34;普通旧对象&#34;,即只包含其他POD或普通类型的结构,如int),因为结构可能是比一堆字节更复杂。您可能会看到this question了解详情。

在你的情况下,stack<>内部保存一个指向一块内存(甚至是几块)的指针,这些内存保存实际数据。创建stack<>时,将分配该内存。当stack<>被销毁时(即变量不再可见,通常发生在}),该内存被解除分配。如果您之后尝试访问它,则会得到未定义的行为。如果你(或其他人)试图在之后销毁它,它也会被称为&#34;双重自由&#34;。

所以,很可能你有双重自由或类似的未定义行为。请注意,详细信息在很大程度上取决于stack<>的确切实现。

在C ++中,您应该使用=来分配复杂结构:

stack<int> a;
// Fill up `a`.
stack<int> b;
b = a;
// Now `a` and `b` are independent stacks with same content.

这也应该适用于你的结构而没有额外的负担。对于更复杂的结构,请应用rule of three