如何删除c ++中的对象?

时间:2017-02-01 10:15:25

标签: c++ directx

我通过

创建了一个指针
    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?

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

编辑:我是指针上的真正的菜鸟

1 个答案:

答案 0 :(得分:0)

该行

type ptr = new type(args);

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

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

delete ptr;

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

因此,试图使用悬空指针,例如, via ptr->member_function(args)格式不正确,很可能崩溃程序。同样,调用

delete ptr;
已删除指针上的

再次格式不正确,可能使程序崩溃。为了避免这种格式错误的代码,您可以在删除后将ptr设置为null,即

delete ptr;
ptr = nullptr;

当(1)您可以轻松验证ptr是否仍然有效(转换为bool仅对nullptr获取false)和(2)避免双重删除问题,如

delete nullptr;

无害(无所作为)。

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

另请注意,通常建议您避免使用delete(甚至是new)而是使用智能指针,例如std::unique_ptr<>,它会自动delete当对象超出范围时指向它,启用异常安全代码而不会发生内存泄漏。