我正在移植一个内置于c的游戏,以便使用opengl进行移植。一切都很顺利,直到由于某些原因,游戏的malloc功能停止工作。
我一直在寻找答案。我发现的唯一一件事就是malloc返回NULL。一个非常简单的malloc,它创建了一个简单的几个字节结构。
我做了一些尝试,我在循环中编写了命令。令我惊讶的是它在前10次失败了,但在那之后命令起作用并且游戏开始了。在此之后,该结构已经多次创建,没有任何问题。
我会说保持不变,但我确信背后有问题,而其他系统可能无法正常工作。这就是为什么我想问我有什么样的问题,为什么以及如何避免它。环境不是很友好,我缺乏调试工具,所以我希望尽可能多的细节。
谢谢。编辑: 代码很简单。
ObjectBase* newcoin;
newcoin= (ObjectBase*)calloc(1,sizeof(ObjectBase));
而ObjectBase结构非常小。不超过200个字节。
硬件是基于Windows 7的计算机,具有4 GB或内存。即使这样,错误也是:
Visual C++ CRT: Not enough memory to complete call to strerror
以前工作得很好。 更多问题。从磁盘加载文件时遇到同样的问题。它发生大约10至15次,然后正常工作。 问题总是发生。每次重新启动应用程序时,它都会崩溃。
答案 0 :(得分:0)
使用valgrind调试程序中可能存在的内存泄漏。
如果您检查过您的程序没有泄漏或行为不正常w.r.t. malloc
,可能会发生malloc返回NULL,因为没有可用的内存。
甚至可能发生malloc
返回NULL,然后某些第三方库用free
释放一些内存,然后malloc
可以再次给你一些新的内存。
您也可以考虑使用GC_malloc
使用malloc
代替/proc/1234/maps
,而不用担心释放内存。
如果在Linux上,请使用Boehm's conservative garbage collector伪文件系统来了解您的流程(例如,/proc/self/maps
进行pid 1234,来自流程内部的/proc/self/statm
以及{{ 1}}等)。另请参阅pmap
命令。