0
template<>
class CalcHashClass<const char*> {
public:
    CalcHashClass(const char* v) {
        _v = new char[strlen(v) + 1];
        strcpy(_v,v);
    }

    ~CalcHashClass() {
        delete [] _v;
    }

    int hashCode() {
        printf("This is 'template <> class CalcHashClass<const char*>'.\n");
        int len = strlen(_v);
        int code = 0;
        for (int i = 0; i < len; ++i)
            code += (int)_v[i];
        return code;
    }

private:
    char* _v;
};

上記のコードの場合、どういうdelete [] _v;意味かわかりませんか?私の理解では、_vはポインタです。そしてそれを削除するには、を使用する必要がありますdelet _v、私は正しいですか?どういう[]意味ですか?

4

4 に答える 4

4

delete x変数xのみを削除します[ ]が、配列が割り当てられたことをメモリマネージャに示します。delete[] x割り当てられたアレイを削除します。

于 2013-03-20T14:41:17.690 に答える
3

_vを指すオブジェクトがどのように割り当てられたかを見てください。

_v = new char[strlen(v) + 1];

構文を使用しnew char[...]ます。つまり、の配列を動的に割り当てcharます。動的に割り当てられた配列を破棄するには、を使用する必要がありますdelete[]

_vこれが必要な理由は、コンパイラが、それが配列を指していることを、タイプのみから判断できないため_vです。_vは単なるであるためchar*、動的に割り当てる単一のにそれを向けることができなかった理由はありませんchar。したがってdelete[]、ここで割り当てられたスペースの正確な量を調べてから、すべてのスペースの割り当てを解除する必要があることをコンパイラーに通知します。

于 2013-03-20T14:41:07.663 に答える
1

delete[]「配列削除演算子」と呼ばれます。を使用して割り当てられた配列を削除しnew[]ます。

delete非配列で配列を使用することは許可されておらずnew、その逆も可能であることに注意することが重要です。

詳細については、「delete[]」演算子が必要な理由を参照してください。

ちなみに、あなたのクラスは三つのルールに違反しています。コピーコンストラクターとコピー代入演算子を提供(または無効化)する必要があります。

于 2013-03-20T14:40:48.590 に答える
1

を使用して配列を割り当てた場合、を使用して割り当てられたメモリだけを使用する場合は、をnew []使用する必要があります。未定義の動作が発生します。投稿されたコードでは、コンストラクターで使用して割り当てています。delete []deletenew []new []

_v = new char[strlen(v) + 1];

したがって、delete []後でデストラクタで呼び出す必要があります。

于 2013-03-20T14:40:55.687 に答える