C++ 什么是“删除[]_v;”意思是
对于以上代码,我不确定删除什么[]\u v;意思是 在我看来,_v是一个指针。删除它应该使用delet v,对吗?[]是什么意思?delete[]称为数组删除运算符。它删除使用新[]分配的数组 需要注意的是,不允许将数组删除与非数组new一起使用,反之亦然 有关详细信息,请参阅C++ 什么是“删除[]_v;”意思是,c++,C++,对于以上代码,我不确定删除什么[]\u v;意思是 在我看来,_v是一个指针。删除它应该使用delet v,对吗?[]是什么意思?delete[]称为数组删除运算符。它删除使用新[]分配的数组 需要注意的是,不允许将数组删除与非数组new一起使用,反之亦然 有关详细信息,请参阅 作为旁注,您的类违反了。您应该提供或禁用复制构造函数和复制赋值运算符。当您使用new[]分配数组时,您需要使用delete[],如果使用just delete并使用new[]分配内存,您将有未定义的行为。在发布的代码中,
作为旁注,您的类违反了。您应该提供或禁用复制构造函数和复制赋值运算符。当您使用new[]分配数组时,您需要使用delete[],如果使用just delete并使用new[]分配内存,您将有未定义的行为。在发布的代码中,您正在使用构造函数中的new[]进行分配,如下所示:
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 = new char[strlen(v) + 1];
它使用新的char[…]语法,这意味着它正在动态分配char数组。要销毁动态分配的阵列,需要使用delete[]
之所以需要这样做,是因为编译器无法仅从_v的类型判断_v是否指向数组。因为_v只是一个char*,所以没有理由不能将它指向单个char。因此delete[]告诉编译器它需要准确地找出这里分配了多少空间,然后取消分配所有空间。delete x只会删除变量x
而[]向内存管理器指示已分配阵列。delete[]x将删除分配的数组。这意味着_v是一个数组。您也可以在新语句中看到[and]。如果您还没有了解原始数组和成员变量,我甚至不知道如何实现模板专门化。我喜欢这个简单易懂的答案。谢谢
_v = new char[strlen(v) + 1];