内存释放冻结了我的程序

Bro*_*ier 2 c++ pointers memory-management

这不是一个问题,只是一个我想要回答的问题。

我正在制作带有粒子的 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
Run Code Online (Sandbox Code Playgroud)

当我单击时,将在鼠标位置创建一个粒子。大约一秒钟后它就会消失,效果很好。它消失后,我可以再次单击以创建一个新粒子。

然而,当我在屏幕上仍然有一个粒子时单击时,我的程序冻结并停止工作。

我的类的析构函数Particle和它的父类的析构函数都是空的。

无需调用,delete我的程序就可以正常运行,即使一次有多个粒子,甚至每帧有多个粒子。我只是想知道是什么导致了这个冻结问题。

hmj*_*mjd 5

根据发布的代码,particles容器将包含悬空指针。任何取消引用这些的尝试都是未定义的行为。我假设它们稍后会被使用,否则它们的存储似乎毫无意义。

调用push_back()并不复制所指向的对象,而是复制指针的值(动态分配对象的内存地址)。如果Particle复制成本低、可复制并且不需要多态行为,只需将其存储Particle在容器中即可。否则,建议使用智能指针,例如,在从容器中移除时std::unique_ptr自动销毁。Particle

  • @SuvP,是的。指向已释放内存的指针本身不是问题,您可以打印指向已释放内存的指针的地址。你不能做的是 _dreference_ 一个指向释放内存(或未分配内存)的指针。在代码的其他地方,它可能取消引用添加到容器的指针之一。 (2认同)