Cat*_*ode 21 c++ lua memory-leaks
我正在用C++编写一个游戏引擎,它也支持Lua.
我最大的恐怖:内存泄漏.
这并不像我的游戏已经被它们所侵扰,我很害怕它们像蘑菇一样从地面冒出来,当开发处于后期并且项目庞大而复杂时.
我很害怕他们,因为他们似乎很难找到我.尤其是在复杂系统中.如果我的引擎差不多完成,游戏就会运行,内存就会消失,我该怎么办?我将从哪里开始搜索?
Chr*_*ard 17
原始指针只是内存泄漏的一个潜在原因.
即使您使用智能指针(如shared_ptr),如果您有一个循环,也可能会出现泄漏 - 解决此问题的方法是在某处使用weak_ptr来打破循环.使用智能指针并不能解决内存泄漏的问题.
您还可以忘记基类中的虚拟析构函数,并以此方式获取泄漏.
即使没有删除新ed对象也没有问题,由于地址空间碎片,长时间运行的进程可能会增长(并且似乎会泄漏).
像valgrind这样的工具对于查找泄漏非常非常有用,但它们并不总能告诉您修复应该在哪里(例如,在循环或对象保持智能指针的情况下)
fra*_*ji1 12
需要一个定义良好的"对象生命周期"模型.无论何时你做"新",你都需要考虑
谁拥有这个堆对象?即谁负责维护此指针并允许其他"客户"引用它?
谁负责删除此对象?这通常是#1,但不一定.
该对象的客户端的生命周期是否长于此对象的客户端?如果这是真的,并且它们实际上正在存储这个堆指针,它将取消引用不再"存在"的内存.您可能需要添加一些通知机制或重新设计"对象生命周期"模型.
很多时候你修复了内存泄漏,但后来遇到问题#3.这就是为什么在编写太多代码之前最好考虑一下对象生命周期模型.
fre*_*low 11
你永远不使用原始指针来对抗内存泄漏.如果你有使用原始指针的代码,重构.
小智 7
我对内存泄漏的恐惧是否合理?
简短的回答是肯定的.很长的答案是肯定的,但有一些技术可以减少它们,并且通常会使它更容易.在我的意见中,最重要的是不要轻易使用new/delete并设计程序以减少或消除尽可能多的动态分配.不要分配内存,请尝试以下操作,只有当这些方法不适合您时才会分配自己的内存(大致按照您应该喜欢的顺序):
如何找出内存泄漏的位置?
Valgrind的的的工具套件:MEMCHECK,Cachegrind,Callgrind,地块,Helgrind ...
您也可以尝试使用电围栏(-sfence for gcc)或您的编译器进行编译.您还可以尝试使用Intels工具套件,尤其是在编写多线程代码或性能敏感代码(例如,Parallel Studio)时,尽管它们很昂贵.
是不是有很好的工具可以帮助找到今天的内存泄漏源?
当然有.往上看.
现在,既然您正在编写游戏,我将分享一些与游戏开发相关的想法/体验:
希望有所帮助.
AFAIK Valgrid只是Linux.
对于Windows,您有BoundsChecker和Purify等工具.
如果您使用的是Visual Studio,那么C运行时库(CRT)也提供了一个非常简单且有用的工具,可用于查找开箱即用的内存泄漏.阅读_CrtDumpMemoryLeaks及其相关函数和宏.
基本上,它可以让你得到的内存泄漏的索引转储当进程退出,然后允许你设置一个断点在泄漏的内存被分配,看看到底当它发生的时间.这与大多数其他工具形成鲜明对比,这些工具只能为您提供事后分析,而无法重现导致内存泄漏的事件.
从第一天开始使用这些小宝石可以让您相对安心,保持良好状态.