大量のメモリを割り当て、一致するドキュメントを見つけようとするクエリ プロセッサを作成しています。一致するものを見つけるたびに、ドキュメントを記述する 2 つの変数を保持する構造を作成し、それを優先キューに追加します。これを何回行うかを知る方法がないため、new を使用して構造体を動的に作成してみました。構造体をプライオリティ キューからポップすると、キュー (STL プライオリティ キューの実装) がオブジェクトのデストラクタを呼び出すことになっています。私の構造体コードにはデストラクタがないため、その場合はデフォルトのデストラクタが呼び出されると想定しています。
ただし、初めて DOC 構造体を作成しようとすると、次のエラーが発生します。
QueryProcessor.exe の 0x7c812afb で未処理の例外: Microsoft C++ 例外: メモリ位置 0x0012f5dc の std::bad_alloc..
何が起こっているのかわかりません - ヒープがいっぱいになるほど多くのメモリを使い果たしましたか? ありそうにありません。そして、そのポインターを以前に使用したことがあるかのようではありません。
まず第一に、エラーの原因となっているのは何ですか?次に、次のコードは複数回機能しますか? 作成された構造体ごとに個別のポインターが必要ですか、それとも同じ一時ポインターを再利用して、キューが各構造体へのポインターを保持すると想定できますか?
これが私のコードです:
struct DOC{
int docid;
double rank;
public:
DOC()
{
docid = 0;
rank = 0.0;
}
DOC(int num, double ranking)
{
docid = num;
rank = ranking;
}
bool operator>( const DOC & d ) const {
return rank > d.rank;
}
bool operator<( const DOC & d ) const {
return rank < d.rank;
}
};
//a lot of processing goes on here
priority_queue<DOC, std::vector<DOC>, std::greater<DOC>> q;
//when a matching document is found, I do this:
rank = calculateRanking(table, num);
//if the heap is not full, create a DOC struct with the docid and rank and add it to the heap
if(q.size() < 20)
{
doc = new DOC(num, rank);
q.push(*doc);
doc = NULL;
}
//if the heap is full, but the new rank is greater than the
//smallest element in the min heap, remove the current smallest element
//and add the new one to the heap
else if(rank > q.top().rank)
{
q.pop();
cout << "pushing doc on to queue" << endl;
doc = new DOC(num, rank);
q.push(*doc);
}
どうもありがとう、bsg。