gpt4 book ai didi

Haskell DLL 导致内存泄漏

转载 作者:行者123 更新时间:2023-12-04 11:54:21 25 4
gpt4 key购买 nike

我正在开发一个使用 Haskell DLL(GHC 版本为 8.0.1 x64)的 C++ 项目。我注意到,正在执行的程序消耗了大量内存。我调查了这件事,这就是我发现的。让我们考虑以下最小示例。这是一个包含三个文件的小项目。

HaskellExports.hs

{-# LANGUAGE ForeignFunctionInterface #-}
module HaskellExports where

import Foreign.C.Types
import Foreign.StablePtr

foreign export ccall foo :: CInt -> IO (StablePtr Int)

foo :: CInt -> IO (StablePtr Int)
foo (CInt n) = newStablePtr (fromIntegral n)

包含一个应该从 C/C++ 代码调用的函数。

CWrapper.cpp

#define DLLExport extern "C" __declspec(dllexport) 

DLLExport void* c_smth (const int num)
{
return 0;
}

我故意没有包含 Haskell 函数的真正导出,因为它们对这个例子没有影响。

main.cpp

#include <Windows.h>

int main()
{
for (;;)
{
HINSTANCE module = ::LoadLibrary(L"HaskellExports.dll");
::FreeLibrary(module);
}
return 0;
}

在这里,在无限循环中,我加载库并立即释放它。让我们尝试以两种不同的方式构建 DLL。首先,我们不包括 Haskell 对象文件:

ghc -c HaskellExports.hs
ghc -c CWrapper.cpp
ghc -shared -no-hs-main -o HaskellExports.dll CWrapper.o

我已经运行了该程序并注意到(在 Windows 进程监视器的帮助下),内存资源被正确捕获和释放。

现在让我们也添加 Haskell 对象文件:

ghc -c HaskellExports.hs
ghc -c CWrapper.cpp
ghc -shared -no-hs-main -o HaskellExports.dll CWrapper.o HaskellExports.o

我再次运行该程序并注意到,它在一段时间内消耗越来越多的内存而无意释放它。这种情况会导致崩溃。

我究竟做错了什么?

附言进一步调查发现只有在 HaskellExport.hs时才会导致内存泄漏。包含至少一个 foreign export功能。

最佳答案

我决定向 ghc-devs 邮件列表发送一封电子邮件。 (要阅读所有信件,请参阅 the question 和更多消息,答案可以在 here 中找到)。

简要说明。内存泄漏的原因如下:对于每个外部导出 RTS 创建一个静态 C 包装器,它在 DLL_PROCESS_ATTACH 上初始化。 ,但它没有在 DLL_PROCESS_DETACH 期间调用的终结器/析构器.所以它会一直存活到程序终止。

关于Haskell DLL 导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52005399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com