2017-02-02 6 views
-4

私はmemcpyを使用してスタックを作成しました。スタックにバッファをコピーします。後でバッファを使ってスタックオブジェクトを作成しようとします。しかし、私は読み取りアクセス違反を取得しています。STLスタック:読み取りアクセス違反

状況をよりよく説明できるコードを下記に示してください。

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. 
+0

'sizeof(DATA)'はあなたの考えを生み出しません。 –

+1

C++にはコピーアンドセマンティクスがありますので、クラスを 'memcopy'するべきではありません。 –

答えて

1

あなたは構造がバイトのちょうど束よりも複雑かもしれないので(のみintのような他のPODまたはプレーンなタイプが含まれていてもよい「昔ながらのオブジェクト」、すなわち構造体)POD以外のものでmemcpyを使用しないでください。詳細はthis questionをご覧ください。

stack<>は、実際のデータを保持するメモリ(またはいくつかのピース)のポインタを内部的に保持します。 stack<>が作成されると、そのメモリが割り当てられます。 stack<>が破壊されたとき(つまり変数がもう見えなくなったとき、通常は}で起こる)、そのメモリ部分は割り当てが解除される。後でそれにアクセスしようとすると、未定義の動作が発生します。あなた(または他の誰か)が後でそれを破壊しようとすると、それは "double-free"と呼ばれる未定義の動作です。

したがって、ほとんどの場合、二重のまたはそれに類する未定義の動作があります。詳細は、正確な実装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を適用してください。

関連する問題