2

私はプログラミングの練習として C/C++ のガベージ コレクターを書いていますnew。ただし、ガベージ コレクターはunordered_map(割り当てられたブロックへのポインターを格納するために) も使用し、マップがオーバーライドされた new を使用しようとすると、事態は深刻に混乱します (無限にループしようとします)。それを作成するために、オーバーライドされた new の呼び出しを避けるために、placement new を使用したいと考えました。

void *buffer = malloc(sizeof(unordered_map<void *, mem_t *>));
unordered_map<void *, mem_t *> map = new(buffer) unordered_map<void *, mem_t *>();

(mem_t は私が定義した構造体ですが、関連があるとは思いません。) 実行すると、このコードは unordered_map コンストラクター内でセグメンテーション違反を起こします。プレースメント new を使用すれば問題は解決すると思いましたが、どうやらそうではないようです。unordered_map が内部で new を呼び出していることは確かです。アロケータを与えると (どうすればいいですか?)、この問題は解決しますか? そうでない場合、この問題は修正可能ですか?

4

1 に答える 1

2

unordered_mapすべての STL コンテナーと同様に、の完全な宣言にはallocator、最後のパラメーターとして以下が含まれます。

template<class Key, class Ty, class Hash, class Pred, class Alloc>
    class unordered_map;

これは、コンテナがすべての内部構造のメモリを取得する場所です。おそらく、ここで独自のアロケータを実装したいと思うでしょう。ウィキペディアは良い出発点のようです。

于 2010-12-17T04:40:36.223 に答える