4

C ++(mingw)のデフォルトの速度の問題を解決するために、メモリアロケータを作成しました。

これを行うために、グローバルなnewとdeleteをオーバーロードしました。私が通過しているすべてのリクエストは、正しいサイズのメモリで正しく割り当てられていますが、それでもセグメンテーション違反が発生しています。これらの欠点は、ベクトルの使用に関するもののようです。

これらのベクトルは、newとdeleteのグローバルオーバーライドでカバーされると思いますが、おそらく間違っています。だから私が求めているのは、メモリアロケータで動作するstlアロケータが必要なのか、それともグローバルなnewとdeleteを使用して見落としている他の問題があるのでしょうか?

4

2 に答える 2

5

これらのベクトルは、newとdeleteのグローバルオーバーライドでカバーされると思いますが、おそらく間違っています。だから私が求めているのは、メモリアロケータで動作するstlアロケータが必要なのか、それともグローバルなnewとdeleteを使用して見落としている他の問題があるのでしょうか?

C ++標準(ここではC ++ 11から)はstd::allocator(標準コンテナに使用されるデフォルトのアロケータ)について述べています:

(§20.6.9/ 1)備考:ストレージは:: operator new(std :: size_t)(18.6.1)を呼び出すことで取得されますが、この関数がいつ、どのくらいの頻度で呼び出されるかは指定されていません。[...]

したがって、ベクトルで使用するための特別なアロケータクラスを実装しなかったという事実は問題ではありません。この問題は、グローバル演算子自体の定義、またはベクトルの使用方法に問題があることが原因である可能性があります。推奨される次のステップは次のとおりです。

  • ::operator newが置き換えられていないときにコードが機能するかどうかを確認します
  • デバッガーを使用してクラッシュのスタックトレースを取得し、その時点でのスタックを分析して、クラッシュに関係する関数、その時点でのローカル変数の値などに関する手がかりを取得します。
于 2013-01-02T08:15:29.640 に答える
0

割り当てを制御するには、 STLアロケータを実装する必要があると思います。vector

于 2013-01-02T07:58:12.870 に答える