【问题标题】:What does 'delete [] _v;' mean?'delete [] _v;' 是什么意思?意思是?
【发布时间】:2013-03-09 17:30:57
【问题描述】:
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,对吗? [] 是什么意思?

【问题讨论】:

  • 表示_v 是一个数组。你也可以在new 语句中看到[]
  • 如果您还没有了解原始数组和成员变量,我不确定您是如何获得模板专业化的。

标签: c++


【解决方案1】:

delete x 只会删除变量 x 而[ ] 向内存管理器指示分配了一个数组。 delete[] x 将删除分配的数组。

【讨论】:

  • 我喜欢这个答案,简单易懂。谢谢!
【解决方案2】:

看看_v指向的对象是怎么分配的:

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

它使用new char[...] 语法,这意味着它动态分配char 的数组。要销毁动态分配的数组,需要使用delete[]

之所以需要这样做,是因为编译器无法判断_v 仅指向_v 类型的数组。因为_v 只是一个char*,你没有理由不能将它指向一个动态分配char。所以delete[] 告诉编译器它需要准确找出这里分配了多少空间,然后将其全部释放。

【讨论】:

    【解决方案3】:

    当你有一个使用new [] 分配的数组时,如果你只使用delete 和使用new [] 分配的内存,你需要使用delete [],你将有未定义的行为。在发布的代码中,您在此处的构造函数中使用 new [] 进行分配:

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

    因此稍后在析构函数中调用delete []

    【讨论】:

      【解决方案4】:

      delete[] 被称为“数组删除操作符”。它删除使用new[] 分配的数组。

      需要注意的是,不允许将数组delete与非数组new一起使用,反之亦然。

      欲了解更多信息,请参阅Why do we even need the "delete[]" operator?

      附带说明,您的课程违反了Rule of Three。您应该提供(或禁用)复制构造函数和复制赋值运算符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-12
        相关资源
        最近更新 更多