我通过
创建了一个指针 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?
编辑:我是指针上的真正的菜鸟
答案 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
= Shell
和ptr
= shell
,即您的变量shell
是指向Shell
的指针。
另请注意,通常建议您避免使用delete
(甚至是new
)而是使用智能指针,例如std::unique_ptr<>
,它会自动delete
当对象超出范围时指向它,启用异常安全代码而不会发生内存泄漏。