如何删除充满类对象的指针数组
How to delete a pointer array full of class objects
我正在学习一些大学教程,我必须删除我用指针制作的这个数组,我应该看到数组中每个对象的解构函数,当我删除它时。这是代码。(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];
- 将Ref对象作为类成员
- 如何在C++中获取该对象的类声明中对象的地址?
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 具有包含其他对象的类的对象创建顺序
- 如何在对象 B 类 C++ 中使用对象 A?
- C++,创建新对象时类的对象更改
- 如何从传递到对象的对象内部访问对象的类属性?
- 如何允许用户在对象和类中输入?
- 在C++中遇到对象和类问题
- 如何通过对象的类属性删除对象,并返回其对象值?
- 如何在不同的开关大小写语句上使用对象的类成员函数?
- 如何将对象从类线程传递到帖子?
- C++ 提升 - 包含类层次结构对象的类的序列化
- 如何生成派生同类对象的类
- 从类中的对象调用类中的函数的最佳方法
- C++对象作为类成员
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 来自另一个类的对象的类向量
- 从std :: fileSystem ::路径对象的类中退出时的分割故障
- 如果类没有任何成员变量,则通过临时对象调用类的成员函数的开销是多少?