如何在c++中删除对象

How to delete objects in c++?

本文关键字:删除 对象 c++      更新时间:2023-10-16

我有一个由创建的指针

Shell* shell = new Shell();

通过初始化

if (!shellTexture->initialize(graphics, SHELL_IMAGE))
throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing shell texture"));
if (!shell->initialize(this, ShellNS::WIDTH, ShellNS::HEIGHT, ShellNS::TEXTURE_COLS, shellTexture))
throw(GameError(gameErrorNS::FATAL_ERROR, "Error initializing shell game object"));

shell.draw();

当炮弹与我的玩家碰撞时,我想摧毁它。我想每x秒也繁殖一次。

我没有使用任何数组或向量来存储其中的对象。

delete shell;

程序在中与我的播放器发生碰撞时崩溃

if (shell->collidesWith(*player,collisionVector))
{
delete shell;
//and damage player
}

如何删除外壳?

实现这一点的最简单方法是什么,这样我就可以从内存中清除它,并能够重新初始化shell?

编辑:我是一个真正的傻瓜在指针

type ptr = new type(args);

(1) 分配足够的内存来保存类型为type的对象,(2)通过用参数args调用其构造函数来创建类型为type的对象,以及(3)将创建的对象的内存地址分配给指针ptr

然后,您可以使用通过存储在ptr中的地址创建的对象,例如ptr->member_function(args)。相反,线

delete ptr;

尝试(1)为type的对象调用析构函数,以及(2)取消分配与该对象相关联的内存。它不会更改ptr的值,即删除后,指针变为悬挂指针:其值(地址)不再引用有效对象的值。

因此,尝试使用悬空指针(例如通过ptr->member_function(args))是错误的,很可能会使程序崩溃。同样,调用

delete ptr;

已删除指针上的再次格式错误,很可能也会使程序崩溃。为了避免这种格式错误的代码,您可以在删除后将ptr设置为空,即

delete ptr;
ptr = nullptr;

当(1)你可以很容易地验证ptr是否仍然有效(只有nullptr才能转换为布尔)和(2)避免双重删除的问题,如

delete nullptr;

是无害的(什么都不做)。


编辑。在您的情况下,type=Shellptr=shell,即您的变量shell是指向Shell的指针。

还要注意的是,通常建议避免使用delete(甚至new),而是使用智能指针,如std::unique_ptr<>,当它们超出范围时,它将自动delete所指向的对象,从而在没有内存泄漏的情况下启用异常安全代码。