如何删除一个充满类对象的指针数组

时间:2014-01-02 10:27:22

标签: c++ arrays pointers heap delete-operator

我正在完成一些大学教程,我必须删除我用指针制作的这个数组,我应该看到数组中每个对象的解构器,我将其删除。这是代码。 (Csprite是基类,CpowerPill,Cghost和Cpacman都是派生类)

    Csprite * psprites[3]; 

psprites[0]=new CpowerPill;
psprites[1]=new Cghost;
psprites[2]=new Cpacman;

delete psprites[0,1,2];


    cin >> endPro;

当我从基类运行这个单一的解构函数调用时,我得到的是当我从相应的派生类中获得3个不同的解构器时。任何帮助都会非常感激。

5 个答案:

答案 0 :(得分:4)

[我假设您的代码编译;即Csprite是基类]

由于您已在每个元素上单独使用new,因此您需要在每个元素上单独使用delete

delete psprites[0];
delete psprites[1];
delete psprites[2];

您在delete psprites[0, 1, 2];中使用的逗号符号并不符合您的想法。 0, 1, 2只是一个值为2的表达式,所以你所做的只是删除最后一个元素。

由于数组psprites是堆栈分配的,因此您无需删除它。事实上,这样做将是未定义的行为

还有一件事,你需要确保Csprite有一个虚拟析构函数,否则你会泄漏内存。您可以通过在其类声明中编写virtual ~Csprite(){}来实现此目的。

答案 1 :(得分:4)

语法[0,1,2]没有做你想要的,因为逗号运算符只是返回它的最后一个参数。你必须在每个元素上调用delete:

delete psprites[0]
delete psprites[1]
delete psprites[2]

这通常在for循环中完成。

答案 2 :(得分:2)

您需要delete每个元素。您可以手动执行此操作:

delete psprites[0];
delete psprites[1];
delete psprites[2];

或者你可以用循环遍历它们。

您当前代码不起作用的原因是因为没有[0,1,2]这样的语法来访问循环中的多个元素。 ,的使用是逗号运算符,它具有右操作数的值。所以你所做的就等于delete psprites[2];。这就是为什么你只能得到一个析构函数调用。

答案 3 :(得分:1)

使用以下内容:

 for (int index = 0; index < 3; index++)
          delete psprites[index];

答案 4 :(得分:0)

其中一种可能的解决方案可以采用以下方式

#include <iostream>
#include <memory>
#include <algorithm>
#include <iterator>

int main()
{
    struct A
    {
        virtual ~A() { std::cout << "A::~A()" << std::endl; }
    };

    struct B : A
    {
        ~B() { std::cout << "B::~B()" << std::endl; }
    };

    struct C : A
    {
        ~C() { std::cout << "C::~C()" << std::endl; }
    };

    struct D : A
    {
        ~D() { std::cout << "D::~D()" << std::endl; }
    };

    A * a[] = { new A, new B, new C, new D };

    std::for_each( std::begin( a ), std::end( a ), std::default_delete<A>() );
}

至于您的代码,则此语句delete psprites[0,1,2];无效。在方括号内有一个带逗号运算符的表达式。所以这个陈述相当于

delete psprites[2];