函数malloc返回NULL ...但只有10次第一次
我正在移植一个使用opengl构建的c游戏,用于移植原因。一切都很顺利,直到出于某些原因,游戏的malloc功能停止工作。函数malloc返回NULL ...但只有10次第一次
我一直在寻找这个答案。我发现的唯一的事情是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次,然后正常工作。 问题总是在发生。每次我重新启动应用程序,它都会崩溃。
使用valgrind来调试程序中可能的内存泄漏。
如果你检查你的程序没有泄漏或行为不端w.r.t. malloc
,可能发生malloc返回NULL,因为没有可用的内存。
它甚至可能发生malloc
返回null,则一些第三方库释放一些内存free
,然后malloc
可能会再次给你一些新鲜的记忆。
您可能还会考虑使用Boehm's conservative garbage collector,它使用GC_malloc
而不是malloc
,而不会打扰多余的空闲内存。
如果在Linux上,使用/proc伪文件系统,以了解你的进程(例如/proc/1234/maps
为PID 1234,也/proc/self/maps
从过程里面,/proc/self/statm
等过程)。另请参阅pmap
命令。
我很抱歉地说我不能依赖它,因为我必须将应用程序移植到几个不支持这些库的系统。我唯一可以说的是,在移植到opengl之前这是工作的,唯一改变的是使用opengl的结构的名称。完全没有理由要求更多的内存,特别是因为应用程序只使用大约30MB的内存。 – user1267350 2012-03-13 20:34:38
你肯定可以在某些系统上使用'valgrind'来调试一些内存泄漏(这些泄漏很可能在你的代码中,所以不依赖于系统)。 – 2012-03-13 20:35:49
请添加一些重要的代码。那样我们就无法判断。 – DonCallisto 2012-03-13 19:49:55
你的环境是什么(硬件,操作系统,编译器)?你可以发布一些代码吗?问题是否完全可重现?这是不太可能的,但可能的情况是可用内存的数量实际上正在变化,这取决于还在运行的是什么。 – 2012-03-13 19:50:55
邮政编码请 – Dan 2012-03-13 19:52:02