【问题标题】:array of classes - delete ops类数组 - 删除操作
【发布时间】:2012-12-09 18:13:06
【问题描述】:

我有这个代码:

 Derived **args = new Derived*[2];
 args[0] = new Derived();
 args[0]->setname("BLABLA \n");
 cout << args[0]->getname();
 delete args[0];

 args[1] = new Derived();
 args[1]->setname("BLABLABLA\n");
 cout << args[1]->getname();
 delete args[1];
 delete [] args;

delete [] args 是必需的吗?为什么?

另外,Derived **args = new Derived*[2] 到底是做什么的?它是否为两个指向Derived 的指针分配空间?如果是这样,那么如何在堆上动态创建一个包含 2 个 Derived 类型的对象的数组?

【问题讨论】:

    标签: c++ heap-memory


    【解决方案1】:

    是否需要 delete [] 参数?为什么?

    是的。它释放new Derived*[2]分配的内存。

    另外,Derived **args = new Derived*[2] 到底是做什么的?

    它为Derived 的两个指针 分配空间。它不会为任何Derived 对象分配空间。

    如何在堆上动态创建一个包含 2 个 Derived 类型的对象的数组?

    只需删除一级间接:

     Derived *args = new Derived[2];
    
     args[0].setname("BLABLA \n");
     cout << args[0].getname();
    
     args[1].setname("BLABLABLA\n");
     cout << args[1].getname();
    
     delete [] args;
    

    但请记住,数组和多态性不能混用。详情见How to make an array with polymorphism in C++?

    【讨论】:

    • @SteveWellens:具体来说,它释放了指针数组,但绝对释放了指针指向的对象。
    • 对,我刚刚删除了我的评论。
    • “它为两个指向 Derived 的指针分配空间”是什么意思?所以基本上我只是创建了一个大小为 2 的数组,其中包含指向 Derived 类型对象的指针?如果是这样,那么如何在堆上动态创建一个包含 2 个 Derived 类型的对象的数组?
    • @NPE:是的多态性!确切地说,我需要使用 args[0] 作为指向 Dervived 对象的指针,因为我想稍后在该对象上使用多态性:$ 这就是为什么我不能采用你提出的第二种解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多