Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是“删除[]_v;”意思是_C++ - Fatal编程技术网

C++ 什么是“删除[]_v;”意思是

C++ 什么是“删除[]_v;”意思是,c++,C++,对于以上代码,我不确定删除什么[]\u v;意思是 在我看来,_v是一个指针。删除它应该使用delet v,对吗?[]是什么意思?delete[]称为数组删除运算符。它删除使用新[]分配的数组 需要注意的是,不允许将数组删除与非数组new一起使用,反之亦然 有关详细信息,请参阅 作为旁注,您的类违反了。您应该提供或禁用复制构造函数和复制赋值运算符。当您使用new[]分配数组时,您需要使用delete[],如果使用just delete并使用new[]分配内存,您将有未定义的行为。在发布的代码中,

对于以上代码,我不确定删除什么[]\u v;意思是 在我看来,_v是一个指针。删除它应该使用delet v,对吗?[]是什么意思?

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];