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只是 a char*,因此您没有理由不能将其指向单个动态 allocate 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 回答