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
,我是对的吗? []
是什么意思?
答案 0 :(得分:4)
delete x
只会删除变量x
而[ ]
向内存管理器指示已分配数组。 delete[] x
将删除已分配的数组。
答案 1 :(得分:3)
查看_v
指向的对象是如何分配的:
_v = new char[strlen(v) + 1];
它使用new char[...]
语法,这意味着它正在动态分配char
的数组。要销毁动态分配的数组,您需要使用delete[]
。
这是必要的原因是因为编译器无法告诉_v
仅指向_v
类型的数组。由于_v
只是char*
,因此您无法将其指向单个动态分配char
。所以delete[]
告诉编译器它需要确切地找出这里分配了多少空间然后解除所有空间。
答案 2 :(得分:1)
delete[]
被称为“数组删除运算符”。它删除使用new[]
分配的数组。
请务必注意,不允许将数组delete
与非数组new
一起使用,反之亦然。
有关详细信息,请参阅Why do we even need the "delete[]" operator?
作为旁注,您的班级违反了Rule of Three。您应该提供(或禁用)复制构造函数和复制赋值运算符。
答案 3 :(得分:1)
当您使用new []
分配数组时,如果仅使用delete []
并使用delete
分配内存,则需要使用new []
,您将有未定义的行为。在发布的代码中,您将在构造函数中使用new []
进行分配:
_v = new char[strlen(v) + 1];
因此稍后在析构函数中调用delete []
。