私のプロジェクトは c++11 で、vs2012 を使用しています。現時点では、カスタム メモリ管理を使用する必要性は感じていませんが、最終的な将来の変更を容易にするためにどのような手配を行う必要がありますか?
「new」/「new[]」/「delete」/「delete[]」にマクロを使用し、コンテナとスマートポインターにtypedefを使用することを考えました。
ベストプラクティスは何ですか?
私のプロジェクトは c++11 で、vs2012 を使用しています。現時点では、カスタム メモリ管理を使用する必要性は感じていませんが、最終的な将来の変更を容易にするためにどのような手配を行う必要がありますか?
「new」/「new[]」/「delete」/「delete[]」にマクロを使用し、コンテナとスマートポインターにtypedefを使用することを考えました。
ベストプラクティスは何ですか?
私の見解では、基本的には、実装全体で使用する特定の規則を決定するだけで済みます。アーキテクチャ アロケータを認識させるための適切なテンプレートは、STL コンテナーでこれがどのように達成されるかを調べ、そのようなデータ構造を設計することです。インターフェイスの例を見ると、std::vector
このコンテナーの 2 番目のパラメーターは常に Allocator 型です。アロケータは、デフォルトのアロケータ実装をカスタム アロケータ実装に簡単に置き換えることができる特定のインターフェイスに従う必要があります。
しかし、あなたが書くコードに戻りましょう: 私が取り組んでいるプロジェクトでは、次のように定義しました。大量のメモリを消費すると思われるオブジェクトの場合、カスタム アロケータを指定できるテンプレート化されたスーパー クラスを定義します。
template<class AllocatedClass, typename Allocator=std::allocator<AllocatedClass>
class AbstractMyClass {
public:
static void *operator new(size_t sz){ /*...*/ }
static void operator delete(void *p){ /*...*/ }
};
ここで、これのサブクラスを定義すると、次のようになります。
class MyClass : public AbstractMyClass<MyClass> {
};
したがって、新しいオブジェクトMyClass
は、親クラスの指定されたアロケーターを使用します。独自のアロケーターを実装する場合は、スーパー クラスのデフォルトのテンプレート パラメーターを単純に置き換えるか、サブクラスで明示的に指定することができます。
このアプローチを使用すると、後でカスタム アロケーターを使用する際に多かれ少なかれ安全になります。
最新の C++ コードでは、めったにnew/new[]/delete/delete[]
使用しないでください。実際、それらはリークしやすく、例外的に安全ではありません。さらに、一般に、生のポインタの所有は、クリーンアップのための適切なデストラクタを使用して、RAII クラスに限定する必要があります。
代わりに ( の代わりに)のようなSTL コンテナーや、、 などのスマート ポインターを使用する必要があります。std::vector
new[]/delete[]
shared_ptr
unique_ptr
STL コンテナの場合、カスタム メモリ割り当てがサポートされています。スケルトン カスタム アロケーターの例については、Mallocatorを参照してください(プール メモリの割り当てなどの特別な割り当て手法を使用してカスタマイズできます)。