ビットごとのコピーとメンバーごとのコピーの違いは何ですか? メンバーをコピーすると、とにかくメンバーを表すビットをコピーすることになりますか?
質問する
5170 次
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 に答える