我正在完成一些大学教程,我必须删除我用指针制作的这个数组,我应该看到数组中每个对象的解构器,我将其删除。这是代码。 (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个不同的解构器时。任何帮助都会非常感激。
答案 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];