これは、インスタンスではなくポインタをコピーしているためです。実際、インスタンスの 1 つへのポインタが失われています。
adapter* p = new adapter;
// translates to:
// void* ptr = alloc(sizeof(adapter));
// adapter* p = (adapter*)ptr;
// new (p) adapter(); // invoke the object's ctor.
adapter* q = new adapter;
// that allocated a new adapter on the heap and ctor'd it.
adapter x;
// this created an actual instance of adapter on the stack;
// when 'x' goes out of scope, because it's on the stack,
// it will be destroyed and it's destructor invoked.
adapter y;
// again, on the stack.
p = q;
// that copied the address of the second allocation into
// the first pointer, *losing* the first pointer. C++ does
// not have garbage collection, so this is called a leak.
x = y; // error: tried to use copy operator.
// this attempts to copy the instance "y" to the instance "x".
これに加えて、コピー オペレーターと ctor の正しいフィンガープリントも取得する必要があります。
private:
adapter& operator=(const adapter&);
adapter(const adapter&);
参照: http://ideone.com/K4rQdx
class adapter
{
private:
adapter& operator= (const adapter& j);
adapter(const adapter&);
public:
adapter()
{}
};
int main()
{
adapter* p = new adapter;
adapter* q = new adapter;
*p = *q;
return 0;
}
ポインターのコピーを防止したい場合は、それらをカプセル化するクラスを作成するか、std::unique_ptr を確認する必要があります。
編集:
C++11 より前では、演算子を「無効にする」ための通常のパターンは、未定義のままにすることです。
private:
adapter& operator = (const adapter&); // name the parameter or not, it's optional.
誰かがクラス外から使用しようとすると、コンパイル時のプライバシー エラーが発生します。クラス内の何かがそれを使用しようとすると、リンカ エラーが発生します (予期している場合は問題ありませんが、リリース延期の問題を修正しようとして窮地に立たされていて、未定義の問題について不平を言っている場合は頭痛の種になります)関数)。
C++11 では、削除済みとしてマークすることができます。これにより、より具体的なエラーが発生します。
public:
adapter& operator = (const adapter&) = delete;
私が使用しているコンパイラのバージョンの中には、最初に古いスタイルのエラーにつながる可視性をチェックするものがあるため、これらを公開することにしました。削除された関数/演算子に遭遇したときに発生する、より役立つエラー。