Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell内存泄漏帮助(Glut状态)_Haskell_State_Glut_Memory Leaks - Fatal编程技术网

Haskell内存泄漏帮助(Glut状态)

Haskell内存泄漏帮助(Glut状态),haskell,state,glut,memory-leaks,Haskell,State,Glut,Memory Leaks,我有最小的代码,有两个问题,尽管现在只有一个问题。那就是我有一个几乎零代码的内存泄漏。另一个原因是glut迫使我使用unsafePerformIO,这样我就可以在回调中使用IORef(没有参数,所以它需要是全局的)。是的,我从那个教程中复制了一些 (不要担心间距): {-#语言存在量化, TemplateHaskell, 班戈模式, 我知道, 广义newtypedering, MagicHash#-} 模块游戏 (游戏(…) )在哪里 进口实体 导入Util 进口胶 进口资源 进口管制.镜头 导

我有最小的代码,有两个问题,尽管现在只有一个问题。那就是我有一个几乎零代码的内存泄漏。另一个原因是glut迫使我使用unsafePerformIO,这样我就可以在回调中使用IORef(没有参数,所以它需要是全局的)。是的,我从那个教程中复制了一些

(不要担心间距):

{-#语言存在量化,
TemplateHaskell,
班戈模式,
我知道,
广义newtypedering,
MagicHash#-}
模块游戏
(游戏(…)
)在哪里
进口实体
导入Util
进口胶
进口资源
进口管制.镜头
导入控件.Monad.State.Lazy
导入Graphics.Rendering.OpenGL隐藏(get)
导入Graphics.UI.GLUT隐藏(get)
导入数据.IORef
import qualified System.IO.Unsafe--非常抱歉,由于回调没有参数,因此无法初始化一些全局引用
数据游戏
{u根::实体
,_资源::[资源]
}
$(制作镜头游戏)
gameRef::IORef游戏
gameRef=System.IO.Unsafe.unsafePerformIO(newIORef$(游戏(实体ENull EDataNull[])[]))
main::IO()
main=do

(progname,up>您不需要全局不安全的
IORef
,只需使用部分应用程序即可

粗略且未经测试的代码:

idleCallback $= (doUpdateGame someLocalIORef)

...

doUpdateGame :: IORef Game -> Maybe (IO ())
doUpdateGame gameRef = Just $ modifyIORef gameRef (snd . runState updateGame)

此外,似乎没有任何东西强迫对
IORef
进行求值,因此这可能是空间泄漏。如果一些明显的严格性注释没有帮助,请尝试分析。

太好了,那么您的问题是什么?是什么导致了这种情况,因为我几乎没有代码?是的,我忘记了IORefs可以更改值,我可以只传递一次
idleCallback $= (doUpdateGame someLocalIORef)

...

doUpdateGame :: IORef Game -> Maybe (IO ())
doUpdateGame gameRef = Just $ modifyIORef gameRef (snd . runState updateGame)