代码之家  ›  专栏  ›  技术社区  ›  Anton K

删除对象数组方式的差异

  •  2
  • Anton K  · 技术社区  · 15 年前

    以下对象数组的删除有什么不同吗?

    MyClass **obj = new MyClass*[NUM];
    for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
    obj[0]->method();
    for (int i=0; i<NUM; i++) delete obj[i]; /// Deletion1
    delete obj;                              /// Deletion1
    

    第二种方式:

    MyClass **obj = new MyClass*[NUM];
    for (int i=0; i<NUM; i++) obj[i] = new MyClass(val);
    obj[0]->method();
    delete[] obj;                            /// Deletion2
    obj = 0x0;                               /// Deletion2
    

    2 回复  |  直到 15 年前
        1
  •  3
  •   Greg Hewgill    15 年前

    在第一个示例中,将显式地为已分配数组成员指向的每个对象调用析构函数。然后删除指针数组(实际上应该是 delete[] 因为您将它作为一个数组分配,但实际上对于本例来说,这可能无关紧要)。

    在第二个示例中,您只删除数组 ,它不调用指向对象的析构函数。不这样做的原因是,您可能在编译器不一定知道的其他变量中复制了这些指针。

    如果要创建一个数组 物体 指针 ,就像这样:

    MyClass *obj = new MyClass[NUM];
    

    运算符将自动为每个 NUM 已分配数组中的对象。

        2
  •  4
  •   James McNellis    15 年前

    两者都不正确。正确的方法是:

    for (int i = 0; i < NUM; i++) delete obj[i];
    delete[] obj;
    

    在你展示的第一种方式中,你使用 delete new[] ,这将导致未定义的行为(如果使用 新的[] ,必须使用 delete[]

    在显示的第二种方式中,泄漏在第一个for循环中创建的所有指针。

    std::vector 与动态分配数组和某种类型的智能指针不同,在大多数代码中不必担心这个问题。