【发布时间】:2013-05-09 15:00:54
【问题描述】:
这不是问题,只是我想回答的问题。
我正在制作带有粒子的 2D 应用程序。在点击处理程序中,我编写了以下代码:
Particle *tempp = new Particle();
tempp->setPosition(mx, my);
particles.push_back(tempp); // typeof particles = std::list<Particle*>
delete tempp; // <- this line is the problem
当我单击时,将在鼠标位置创建一个粒子。大约一秒钟后,它应该会消失,效果很好。消失后我可以再次点击创建一个新粒子。
但是,当我在屏幕上仍有一个粒子时单击时,我的程序会冻结并停止工作。
Particle 类的析构函数及其父类的析构函数都是空的。
不调用delete 我的程序运行良好,即使一次有多个粒子,甚至每帧有多个粒子。我只是想知道是什么导致了这个冻结问题。
【问题讨论】:
-
您正在将指向 tempp 的指针添加到向量 - 在 tempp 被删除后它指向什么?
-
为什么要将 tempp 推入列表,然后在后面的行中删除它?您的列表包含指向垃圾的指针,任何访问它们的尝试都可能导致您的程序崩溃。
-
那么到方法结束后指向tempp的指针还存在吗?如果我删除它,内存会被覆盖吗?
-
@Broxzier 您的列表不是函数本地的,因此即使在方法之外也存在。当您删除时,实际分配的内存被释放(可重复使用//它可能被覆盖,就在那里。但它不在那里供您使用并且它的 UB 取消引用它)指针仍然包含地址。 list 没有超出范围,因此它仍然具有带有地址的指针。您可能正在取消引用
deleted内存地址(可能用于在屏幕上绘制点,或者可能在超时后尝试擦除它并冻结它)
标签: c++ pointers memory-management