1

JavaからC++に適応しようとしていますが、STL priority_queueからアイテムをpop()するときに、メモリを管理する正しい方法がわかりません。

不要になったキューから削除されたアイテムをクリーンアップするためにdeleteを使用することになっていますか?もしそうなら、どのように?そうでない場合は、なぜですか?

私はpriority_queue(以下のコード)の使用方法を学ぶための小さなプログラムを自分で作成しました。このプログラムでは、メモリリークが発生しても大した問題ではありません。これは、非常に小規模で、すぐに終了するためです。しかし、メモリリークなしではるかに大きなキューを正しく処理するプログラムを作成できるように、正しい方法を学びたいと思っています。

私が理解していないのは、これです。top()は、ポインターではなく参照を返します。しかし、参照で削除を使用することはできませんか?

誰かが私をここで正しい方向に向けることができますか?

--------------------

struct PathCost{
    int dest;
    int cost;
    PathCost(int _dest, int _cost){
      dest = _dest;
      cost = _cost;
    }
    bool operator<(PathCost other) const;
    bool operator>(PathCost other) const;
};

bool PathCost::operator<(PathCost other) const{
  return cost < other.cost;
}
bool PathCost::operator>(PathCost other) const{
      return cost > other.cost;
}


int main(){

  PathCost pc = PathCost(1, 2);
  pc = PathCost(3, 4);
  PathCost* pcp = new PathCost(5, 6);
  delete pcp;

  priority_queue<PathCost,
                 vector<PathCost>,
                 greater<vector<PathCost>::value_type> > tentativeQ;

  cout << "loading priority queue ...\n";
  tentativeQ.push(PathCost(8, 88));
  tentativeQ.push(PathCost(5, 55));
  tentativeQ.push(PathCost(7, 77));
  tentativeQ.push(PathCost(4, 44));

  cout << "\nlist items on queue in priority order ...\n";
  while (!tentativeQ.empty()){
    pc = tentativeQ.top();
    cout << "dest:" << pc.dest << " cost:" << pc.cost << endl;
    tentativeQ.pop();
    /* DO I NEED TO DO MEMORY CLEANUP AT THIS POINT? */
  }
}
4

1 に答える 1

2

不要になったキューから削除されたアイテムをクリーンアップするためにdeleteを使用することになっていますか?もしそうなら、どのように?そうでない場合は、なぜですか?

PathCostpriority_queueはオブジェクトを保持しているため、クリーンアップを実行する必要はありません。それらがキューから削除されると、言語の規則に従って、それらのデストラクタが自動的に呼び出されます。

舞台裏では、ストーリーはやや複雑になる可能性があります。アイテムをpriority_queueデータ構造に挿入すると、通常、そのオブジェクトのコピーが動的に割り当てられます。ただし、リソースの割り当てと割り当て解除は、基盤となるデータ構造(デフォルトstd::vector)によって処理されるため、メモリ管理について心配する必要はありません。標準ライブラリコンテナとコンテナアダプタは、値のセマンティクスを持っていると言われています。

私が理解していないのは、これです。top()は、ポインターではなく参照を返します。しかし、参照で削除を使用することはできませんか?

は保持している要素を所有priority_queueしていると言われているため、その要素の1つを参照している場合、それを削除することはできません。実際、削除する必要があるかどうかはわかりません。さらに、キュー内の要素の参照にアクセスできますが、これらの要素への参照を保持する必要はありません。独自のコピーを作成することもできます。

const PathCost& pRef = tentativeQ.top(); // take constant reference to top element
PathCost p = tentativeQ.top(); // make copy of last element

最初のケースでは、の呼び出しによって最上位の要素が削除された後は、その参照を使用しないように注意する必要がありますpop()

于 2012-10-14T08:31:13.373 に答える