【问题标题】:Haskell Memory Leak Help (Glut State)Haskell 内存泄漏帮助(Glut 状态)
【发布时间】:2013-06-10 03:30:16
【问题描述】:

我有最小的代码,有两个问题,虽然现在只有一个很重要。那是我的内存泄漏几乎为零代码。另一个是过剩迫使我使用 unsafePerformIO 只是为了让我可以在回调中使用一个 IORef(没有参数,所以它需要是全局的)。是的,我从那个教程中复制了一些。

(不用担心间距):

{-# LANGUAGE ExistentialQuantification,
             TemplateHaskell,
             BangPatterns,
             RecursiveDo,
             GeneralizedNewtypeDeriving,
             MagicHash #-}
module Game
( Game (..)
) where
import Entity
import Util
import GUtil
import Resources
import Control.Lens
import Control.Monad.State.Lazy
import Graphics.Rendering.OpenGL hiding (get)
import Graphics.UI.GLUT hiding (get)
import Data.IORef
import qualified System.IO.Unsafe --I'm so so sorry, it's to initialize some global references since the callbacks don't have parameters

data Game = Game
          { _root :: Entity
          , _resources :: [Resource]
          }
$(makeLenses ''Game) 

gameRef :: IORef Game
gameRef = System.IO.Unsafe.unsafePerformIO (newIORef $ (Game (Entity ENull EDataNull []) []))

main :: IO ()
main = do
    (progname, _) <- getArgsAndInitialize
    createWindow "Hello World"
    idleCallback $= doUpdateGame
    displayCallback $= display
    reshapeCallback $= Just reshape
    mainLoop
reshape s@(Size w h) = do
    viewport $= (Position 0 0, s)
    postRedisplay Nothing

display :: IO ()
display = do
    clear [ ColorBuffer ]
    flush

doUpdateGame :: Maybe (IO ())
doUpdateGame = Just $ do
                modifyIORef gameRef (snd . runState updateGame)
updateGame :: State Game ()
updateGame = do 
                return ()

在这一小段代码中,哪里有可能导致泄漏的问题?

【问题讨论】:

  • 太好了,你的问题是什么?
  • 是什么原因导致我的代码接近于零?

标签: haskell state glut memory-leaks


【解决方案1】:

您不需要全局不安全IORef,只需使用部分应用程序即可。

粗略且未经测试的代码:

idleCallback $= (doUpdateGame someLocalIORef)

...

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

此外,似乎没有什么会迫使 IORef 被评估,所以这可能是空间泄漏。如果一些明显的严格性注释没有帮助,请尝试分析。

【讨论】:

  • 是的,我忘了 IORefs 可以改变值,我可以只通过一次
猜你喜欢
  • 2011-03-28
  • 2011-02-18
  • 1970-01-01
  • 2020-10-11
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多