7

標準のアロケーターをより堅牢なアロケーターに置き換えたいと考えています (C++ 標準では、vector::resize のオーバーフロー チェックのみが必要です)。多くのライブラリで提供されているさまざまな C++ アロケータは、負のセルフ テストが与えられると、まったく機能しなくなります。

より堅牢なアロケーターにアクセスできます。ESAPI のアロケータは、オーバーフローをチェックするだけでなく、間違いを見つけるのに役立つデバッグ インストルメンテーションも備えています。http://code.google.com/p/owasp-esapi-cplusplus/source/browse/trunk/esapi/util/zAllocator.h .

プログラムで使用されている C++ アロケータをあまり手間をかけずに置き換える標準的な方法はありますか? また、ソースコードにアクセスできない可能性があるライブラリコードで確実に置き換えたいと考えています。

4

3 に答える 3

6

malloc同じシグネチャを持つ別の関数に置き換えることができるライブラリ関数とは異なりstd::allocator、クラス テンプレートとテンプレート コードは必要に応じてインスタンス化され、それを使用するコードにインライン化されます。一部の標準ライブラリ コードは、既にライブラリのオブジェクト ファイルにコンパイルされており、std::allocator 置き換えることができないインスタンス化されたコードが含まれています。したがって、唯一の方法は、標準ライブラリがその を置き換える非標準的な方法を提供している場合std::allocatorです。幸いなことに、GCC の libstdc++ を使用するとstd::allocator、GCC の構成およびビルド時に使用する実装をいくつかの異なる選択肢から選択できます。

std::allocatorオプションの 1 つとして ESAPI アロケータを GCC ソースに追加し、GCC を再構築して、そのアロケータをその実装を提供する基本クラスとして使用するのは、それほど面倒なことではありません。ESAPI アロケーター コードを少し調整する必要があるかもしれません。また、libstdc++configureスクリプトを変更して、--enable-libstdcxx-allocator=esapi

于 2012-11-08T22:58:13.633 に答える
5

コンテナーごとではなく、グローバル ベースで割り当てを変更する場合は、おそらく と を置き換え::operator newます::operator delete。おそらく、あなたも同様に置き換えたいと思うでしょう::operator new[]-::operator delete[]しかし、これらは配列の割り当てにのみ使用されます.の場合、std::vectorいくつかの点で配列にかなり似ていますが)。

ライブラリのほとんどの部分を置き換えようとすることは禁止されていますが、標準では特にこれらの置き換えを許可しています。

もちろん、誰かが特定のコンテナーに対して既に別のアロケーターを指定しており、そのアロケーターが::operator new(または::operator new[])を介して (最終的に) メモリを取得しない場合、そのコンテナー/それらのコンテナーには影響しません。

于 2012-11-07T07:14:42.887 に答える
3

C++0x では、カスタム アロケータを使用して名前空間mystdに新しいテンプレート エイリアスを定義します。すべての を にstd::vector置き換えます。コード内のすべてを取り除きます。std::vectormystd::vectorusing namespace stdusing std::vector

再構築します。vector<T>rawを使用した場所を に置き換えますmystd::vector<T>

ああ、よりも良い名前を使用してmystdください。

于 2012-11-07T06:09:47.137 に答える