2012-03-13 74 views
-3

我正在移植一个使用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次,然后正常工作。 问题总是在发生。每次我重新启动应用程序,它都会崩溃。

+1

请添加一些重要的代码。那样我们就无法判断。 – DonCallisto 2012-03-13 19:49:55

+3

你的环境是什么(硬件,操作系统,编译器)?你可以发布一些代码吗?问题是否完全可重现?这是不太可能的,但可能的情况是可用内存的数量实际上正在变化,这取决于还在运行的是什么。 – 2012-03-13 19:50:55

+0

邮政编码请 – Dan 2012-03-13 19:52:02

回答

0

使用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命令。

+0

我很抱歉地说我不能依赖它,因为我必须将应用程序移植到几个不支持这些库的系统。我唯一可以说的是,在移植到opengl之前这是工作的,唯一改变的是使用opengl的结构的名称。完全没有理由要求更多的内存,特别是因为应用程序只使用大约30MB的内存。 – user1267350 2012-03-13 20:34:38

+0

你肯定可以在某些系统上使用'valgrind'来调试一些内存泄漏(这些泄漏很可能在你的代码中,所以不依赖于系统)。 – 2012-03-13 20:35:49