問題タブ [allocator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ブースト shared_ptr を使用したカスタム (プール) アロケーター
Boost の Pool インターフェイスなど、shared_ptr によって管理されるオブジェクトをプールから割り当てたいのですが、どうすれば実現できますか?
c++ - C++ アロケーター::deallocate(NULL,1) は許可されますか?
free(NULL)
との両方::operator delete(NULL)
が許可されます。アロケータの概念 (例: std::allocator も許可deallocate(NULL,1)
されていますか、それとも独自のガードを配置する必要がありますか?
com - 失敗した新規のチェック
この ATL/COM コードが割り当ての成功をチェックするのはなぜですか? CoGetALloc またはそのような API を介してカスタム割り当てが表示されることを期待していました。標準準拠の C++ ランタイムは std::bad_alloc をスローする必要がありますが、スローしない impl とアロケーターが実際に交換されている可能性があります。
c++ - オブジェクトをメモリ内の特定の場所に構築するにはどうすればよいですか?
私は本質的に、単一のクラスを割り当てるオブジェクト プール アロケータを書いています。必要なオブジェクトに合わせて十分なメモリを割り当て、内部のスペースへのポインタを渡しています。
ここで私の質問は次のとおりです。プール内でポインターを取得したら、そこにオブジェクトを作成するにはどうすればよいですか?
c++ - 文字列のカスタムアロケータを設定する
構文を使用して、ベクトルのカスタムアロケータを設定できることはわかっていますvector<T, Alloc>
。文字列に対して同じことができる方法はありますか?
c++ - stl のアロケータを実際のソースコードに置き換える方法
アロケーターを元のソース コードに置き換える必要があります。PE エクスポート テーブルからエクスポートされたメソッドを抽出していますが、元のソース コードで STL コンテナーが使用されていた奇妙な長いアロケーターに直面しています。つまり、ソース コードが次の場合:
私が取得しているエクスポートテーブルから:
上記の長いアロケータから元のソース コードへのバックトラックを取得するにはどうすればよいですか? (typedef のサイズはさらに大きくなります。)
よろしく、
ウスマン
c++ - 参照カウント オブジェクトと複数のアロケータ
これは、C++ と参照カウント オブジェクト階層を想定した設計上の問題です。私のコードベースの多くのクラスは、共通の基本クラス (ObjectBase) から派生しています。これは、retain() および release() メソッドを実装して、オブジェクト インスタンスの参照カウントを増減します。
オブジェクトのすべてのインスタンスは、多数のユーザー定義可能なメモリ アロケータを使用して、スタックまたはヒープ上に作成できます。オブジェクト インスタンスが release() メソッドで、retainCount が 0 に達したときに自殺する (これを削除する) ためには、インスタンスは、それがどのアロケーターで構築されたかを認識している必要があります。
現時点では、任意のアロケーターを使用してオブジェクト インスタンスにメモリを割り当てています。次に、placement new を呼び出してオブジェクト インスタンスを構築し、オブジェクトで setAllocator() メソッドを呼び出して、作成されたアロケーターを設定しています。オブジェクトがスタック上に構築されている場合、アロケータは NULL に設定され、release() は delete を呼び出しません。このプロセスは非常に冗長で、エラーが発生しやすい可能性があります (メモリ リーク、setAllocator の呼び出しを忘れた場合など)。
ただし、これにより、任意の数のコンストラクター引数をサポートすることが非常に困難になります。
この問題を解決する方法についてのアイデアを探しています。特にほとんどのクラスは共通のベースから派生するため、スマート ポインターに依存せずにカウント オブジェクトを参照できるというアイデアが本当に気に入っています。
ご協力いただきありがとうございます。
フロリアン
c++ - リリースで std::vector<> のカスタムアロケータ?
私は、C++ で設定されたサードパーティの C API を使用しています。これには、この議論に関係する 2 つの方法があります。
- これは malloc() と同等です: the_api_malloc(size) (および一致する the_api_free())
- the_api_malloc() で作成されたメモリが返され、その所有権と the_api_free() の所有権が内部的に取得される関数: the_api_give_back(ptr)
たとえば、std::vector で使用するために、the_api_malloc() および the_api_free() をラップするカスタム アロケータを作成しました。これはうまくいきます。
私がしたいのは、カスタム アロケータを利用する std::vector 型クラスを持ちますが、呼び出されるとメモリの所有権を解放する release() メソッドも持つため、カスタム アロケータ the_api_free() を呼び出さないことです。
使用例:
これをやってのける最善の方法がわかりません。実験として私が今持っているものはかなり厄介です:
より良い方法はありますか?
UPDATE 1:以下の提案に基づいて私が試したことは次のとおりです。これは、望ましい動作と現在失敗している場所を示すのにも役立ちます。
更新 2: MyOwningAllocator と MyNonOwningAllocator を作成してから、「リリース時」に所有から非所有にスワップしようとしましたが、タイプが異なるため、swap() を機能させることができません。
c++ - alloca を使用し、それ以外は C++ STL に準拠しているアロケーターはありますか?
2 つの質問があります。
1) alloca を使用してスタックにメモリを割り当てるアロケータを実装することは可能ですか? それ以外は C++ STL に準拠していますか?
コードが公開されている場合は、その URL を教えていただければ幸いです。:-) そこにコードがない場合は、関数の割り当てと割り当て解除をスケッチできますか?
2) 上記の質問に対する答えが「はい」の場合、クラス メンバーのスタックにメモリを割り当てる方法を理解したいと思います。例として、
そして、このベクトルのメンバー関数「resize」の呼び出しが、最初に「deallocate」を呼び出し、次にアロケーターの「allocate」を呼び出すとします。
allocate が呼び出されるスコープは、メンバー関数 resize のスコープです。これは、割り当てられたメモリがその関数呼び出しの最後にスタックから削除されることを意味しませんか?
敬具、ビョルン
c++ - llvm-gcc std::アロケータのバグ?
コード:
g++ (4.4.3) と llvm-g++ (4.2.1) の両方でコンパイルされますが、後者の seg fault の出力:
割り当てられていないものを解放する問題のようです。これは llvm-gcc のバグですか?
更新: llvm メーリング リストでの議論に基づいて、これは llvm-gcc または新しいバージョンで修正された STL の実装のバグのようです。ただし、調べるためにリポジトリから llvm-gcc をインストールしてビルドする必要はありません。