0

多くのメンバー関数に加えて、私の Graph クラスには 3 つの主要なメンバーがあります。「頂点」と呼ばれる頂点へのポインターのベクトル、「エッジ」と呼ばれるエッジへのポインターのベクトル、および整数カウンター変数です。ベクトルからメモリの割り当てを解除するためにデストラクタを書き始めました/書き込もうとしましたが、それが正しく行われているかどうかわかりません。そして、私はカウンターについて何をしますか?「カウンターを削除」と言おうとしましたが、ポインターではありません (おっと)。

Graph<Object,Weight>::~Graph(){
        for(unsigned int i=0; i<vertex.size(); ++i){
                delete vertex[i]; }
        for(unsigned int j=0; j<edge.size(); ++j){
                delete edge[j]; }

        //counter? 
}
4

5 に答える 5

2

削除は、割り当てた方法によって異なります。C++ での削除と削除 [] の違いを参照してください。

int メンバーについては、動的に割り当てていない (new を使用していない) ため、削除する必要はありません。

于 2012-04-22T16:01:47.087 に答える
1

vertexのタイプを想定し、std::vector<Vertex*>次のようにベクトルを作成します。

vertex.push_back( new Vertex );

クリーンアップコードは正しく見えます。

しかし、私はあなたにこれをしないように強く勧めます。vertexとして宣言すれば、個々のベクターメンバーstd::vector<std::unique_ptr<Vertex>>を心配する必要はもうありません。delete

Boostを使用している場合は、を作成することもできvertexますboost::ptr_vector

counter変数に関しては、newクラス構築中にどこかでカウンターを使用していない限り、その必要はありませんdelete

于 2012-04-22T16:04:40.310 に答える
0

counterプレーンな通常のint変数ですか? もしそうなら、あなたはその生涯を担当していません。

deleteキーワードは、newキーワードでオブジェクトを作成した場合にのみ使用されます。(それでも、削除を行っている shared_ptr など、プログラムに他に何かがない場合のみ)

new/delete を使用する場合、言語から引き継いで、オブジェクトの有効期間/存在を自分で管理します。通常の変数は自動的に作成および破棄されるため、心配する必要はありません。

于 2012-04-22T16:02:48.690 に答える
0

私はそれを想定してvertexおり、?edgeを使用して割り当てられています。newあなたが書いたものは問題ありませんが、vertexandedgeを配列として宣言し、演算子をnew使用して編集した場合は、代わりに呼び出しを使用する必要があります。カウンターがポインターとして宣言されていない場合は、カウンターを削除する必要はありません。 .new []delete []deletenew

設計上の決定として、オブジェクトが参照カウントされるようにvertexオブジェクトedgeを宣言boost::shared_ptrすることを検討する必要があります。オブジェクトがスコープ外になると、それらは自動的にクリーンアップされるため、デストラクタを肉付けする必要さえありません。unique_ptrGraph

c++11 を使用している場合は、stdバージョンを使用でき、 や などは必要ありboostませstd::shared_ptrstd::unique_ptr

于 2012-04-22T15:59:51.687 に答える
0

次の方法でポインタの配列を削除できます。

del[] arr; // arr is array of pointers.

一方、counterスタックからの場合、プログラムがそれを処理し、プログラマーとしてそのメモリの解放について心配する必要はありません。

于 2012-04-22T16:01:00.877 に答える