0

文字列キーint、bool、文字列、またはさまざまなタイプのポインタをとして持つことができるハッシュマップクラスを構築しており、それを機能させたいと考えています。使用しているプログラムでは、ポインターを作成してハッシュマップに渡します。マップを破壊する必要があるときに問題が発生します。ハッシュマップのタイプがポインターの場合、コンテナーを削除する前に、ハッシュマップ(値)を削除する必要があります。

したがって、現在のコードは次のようになります。hashNode**ドロワーがあり、これを2次元配列として使用してマップ内のhashNodesへのポインターを保持します。これらの同じポインターは、別のhashNode **配列にも保持され、マップに追加されるときにそれらを格納します(ハッシュマップの拡張とコピーを容易/高速化するため)。

template <typename V>
class str_map {
public:
    // ...
    virtual ~str_map() {
        str_map<V>::~str_map();
    }
    // ....
};

その後、次のようなメソッドがたくさんあります。通常の値用のメソッド:

template <>
str_map<int>::~str_map() {
    for(int i=0; i < count && array[i] != NULL; i++){
        delete array[i];
    }
    delete array;
    delete drawers;
}

1つはポインタ用です。

template <>
str_map<str_map<int>*>::~str_map() {
    for(int i=0; i < count && array[i]->val() != NULL; i++)
        delete array[i]->val();
    for(int i=0; i < count && array[i] != NULL; i++){
        delete array[i];
    }
    delete array;
    delete drawers;
}

すべてのメモリが正しく処理されるように、str_mapクラスのインスタンスを正しく分解する別のより良い方法はありますか?または、少なくともこれを機能させる方法はありますか?

4

1 に答える 1

1

コンテナはを処理する必要があります。それだけです、それ以上でもそれ以下でもありません。誰かがポインタを突き刺したい場合は、それらを許可します。彼らが指し示しているかもしれないし、そうでないかもしれないものは何でも所有権を持たないでください。

メモリの存続期間を管理する方法を知るのは、ハッシュマップのユーザー次第です。それらはスマートポインタを使用しているはずなので、クラスはそれらをコピーするだけで、スマートポインタがメモリを管理します。

ガイドラインは、1つのリソースを管理するか、まったく管理しないことです。複数のリソースを管理している場合は、障害が発生する可能性があります。

delete arrayはそうあるべきだと思いますdelete [] array;。これが意味するのは、実際にを使用する必要があるということstd::vectorです。ここでも、1つのリソースを管理するか、まったく管理しないかのいずれかです。1つのstd::vectorリソースを管理するため、管理する必要はありません。等々。

于 2010-11-10T00:44:10.153 に答える