c++ - 内存释放卡住了我的程序

标签 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

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

但是,当我在屏幕上仍然有一个粒子时单击时,我的程序会卡住并停止工作。

Particle 类的析构函数 及其父类的析构函数 都是空的。

如果不调用 delete,我的程序运行良好,即使一次有多个粒子,甚至每帧多个粒子。我只是想知道是什么导致了这个卡住问题。

最佳答案

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

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

关于c++ - 内存释放卡住了我的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16464921/

相关文章:

c++ - rand() 给出序列号,即使在我的 Mac 上播种时也是如此

c - 指针&字符段错误

ios - View 未完全释放

c - 获取指针数据的大小

iOS:简单的保留周期

C++ 当两者都包含时,如何从另一个文件中调用与另一个文件中的函数同名的函数?

c++ - Valgrind 在应用程序运行时打印带有错误的摘要,但在完成后表示不会发生泄漏

c++ - 在堆栈类中使用指针?

c - ValedasFloresRetail.exe : 0xC0000005: Access violation writing location 0x00000000 中 0x775615de 的未处理异常

针对缓冲区溢出、格式字符串错误和整数溢出的 C++ 安全框架