2017-11-19 10 views
2

オペレータnewのクラスの1つを実装するときは、他のすべてのフォームも実装することをお勧めします。そうでなければ、c++の直観的な可視性の規則ではないため、悪いことが起こる可能性があります。これらの悪い事は何で、どうやって起こりますか?実装されていないフォームは非表示にできますか?オペレータの新しい実装の可視性の問題

答えて

1

グローバルオペレータnewの機能にクラス固有のoperator newがオーバーロードされているとします。

TL; DR:細かいメモリ制御が必要な場合は、標準コンテナと同様にアロケータのパラダイムを使用することを検討してください。ルールは複雑でエラーが発生しやすいです。

これらのすべてを実装する最も一般的な理由は、混乱している呼び出しコンテキストによるものです。しばしば、クラス固有のnewは、グローバル演算子の観点から実装されます。しかし、これは必須ではないので、あなたは驚くことがあります。

例えば、class Aclass Bと書いて、割り当てを制御したいとします。 ABの上書きを書きます。あなたのコードの

void *very_clever_allocator(size_t sz); 

class A { 
    void* operator new(size_t sz) { 
     return very_clever_allocator(sz); 
    } 
}; 

class B { 
    void* operator new(size_t sz) { 
     return very_clever_allocator(sz); 
    } 
}; 

A善意のユーザーが書いている:

void *operator(size_t sz) { 
    return incompatible_allocator(sz); 
} 

誰かが::new A;とあなたのクラスを割り当てた場合、クラス固有のバージョンは無視されます。したがって、突然、異なるアロケータが使用されます。プログラマは注意しないで、削除を呼び出すかもしれません。注意するので、operator deleteも定義しています。しかし今、あなたのvery_clever_allocatorはこのオブジェクトについて知りません。これはバグを診断するのが難しいでしょう。

これは一般的ではありませんが、これらのルールは非常に複雑なので、通常Allocatorを使用する方が簡単です。あなたがデバッグするコードを書いているのなら、これは一度だけOKです。

続きを読む: https://eli.thegreenplace.net/2011/02/17/the-many-faces-of-operator-new-in-c

関連する問題