5

ビットごとのコピーとメンバーごとのコピーの違いは何ですか? メンバーをコピーすると、とにかくメンバーを表すビットをコピーすることになりますか?

4

4 に答える 4

5
class MyClass
{
public:
    MyClass () : m_p (new int (5)) {}
    ~MyClass () {delete m_p;}
    int* m_p;
};

MyClass a;
MyClass b;
memcpy (&a, &b, sizeof (a));

最初に解放せずにメンバー変数を書き換えて、「a」に割り当てられたintをリークしました。そして、'a' と 'b' には同じメモリ位置を指している m_p があり、どちらも破壊時にそのアドレスを削除します。そのメモリを削除しようとする 2 回目の試行はクラッシュします。

于 2013-02-27T22:20:35.057 に答える
4
  • ビット単位のコピー: オブジェクトのオブジェクト表現を未解釈のバイト シーケンスとしてコピーします。
  • メンバーごとのコピー: オブジェクトの各サブオブジェクトを、その型に応じて適切にコピーします。コピー コンストラクターを呼び出すことを意味する自明でないコピー コンストラクターを持つオブジェクトの場合。自明にコピー可能な型のサブオブジェクトの場合、これはビットごとのコピーを意味します。

両方とも同じであるため、すべてのサブオブジェクトが自明にコピー可能である場合、オブジェクト全体が自明にコピー可能です。(クラス (サブ) オブジェクトにも、仮想メンバー関数または仮想基底クラスがあってはなりません。)

于 2013-02-27T22:27:32.900 に答える
1

オブジェクトをバイナリ コピーしている場合は、参照カウンターなど、コピーしてはならない内部が存在する可能性があります。ビットごとのコピーはこれを壊します。メンバーのコピーは正しい機能を使用します。

于 2013-02-27T22:16:52.247 に答える
0

参照またはポインター型のメンバーをビットごとにコピーすると、問題が発生する可能性があります。本当に必要なものに依存し、結果のクラス インスタンスの浅いコピーまたは深いコピーを使用して処理できます。

于 2013-02-27T22:19:05.917 に答える