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

How to delete a pointer array full of class objects

本文关键字:对象 满类 指针 数组 何删除 删除      更新时间:2023-10-16

我正在学习一些大学教程,我必须删除我用指针制作的这个数组,我应该看到数组中每个对象的解构函数,当我删除它时。这是代码。(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 个不同的解构函数。任何帮助将不胜感激。

[我假设你的代码可以编译;即 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(){}来实现此目的。

语法

[0,1,2]不会执行您想要的操作,因为逗号运算符只是返回最后一个参数。您必须对每个元素调用删除:

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

这通常在for循环中完成。

您需要

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

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

或者,您可以使用循环循环遍历它们。

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

使用以下:

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

可能的解决方案之一如下所示

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