haskell - Haskell 的 FFI 上的函数 'free' 似乎不起作用

标签 haskell ffi

我想熟悉 Haskell 的 FFI,所以我写了这个小例子:

主要.hs:

{-# LANGUAGE ForeignFunctionInterface #-}

import Foreign.C.Types
import Foreign.Ptr (Ptr)
import Foreign.Marshal.Array (peekArray)
import Foreign.Marshal.Alloc (free)

foreign import ccall "test.h test"
  test :: CInt -> Ptr CInt

main = do
  let rval = test 6

  -- print the array
  list <- peekArray 6 rval >>= return . map toInteger
  putStrLn $ show list

  free rval

  -- print it again (it should okay)
  putStrLn $ show list

  -- try to retrieve it AGAIN after I used free. Should print random values
  peekArray 6 rval >>= return . map toInteger >>= putStrLn . show

测试.h

#ifndef TEST_H
#define TEST_H

int* test(int a);

#endif

测试.c

#include "test.h"
#include <stdio.h>
#include <stdlib.h>

int* test(int a)
{
    int* r_val = (int*)malloc(a * sizeof(int));
    r_val[0] = 1;
    r_val[1] = 2;
    r_val[2] = 3;
    r_val[3] = 4;
    r_val[4] = 5;
    r_val[5] = 6;
    return r_val;
}

编译并运行 Main.hs 时得到的输出是:

D:\Code\Haskell\Projects\Dev\TestFFI>cabal build
Building TestFFI-0.1.0.0...
Preprocessing executable 'TestFFI' for TestFFI-0.1.0.0...
[1 of 1] Compiling Main             ( src\Main.hs, dist\build\TestFFI\TestFFI-tmp\Main.o )
Linking dist\build\TestFFI\TestFFI.exe ...

D:\Code\Haskell\Projects\Dev\TestFFI>
D:\Code\Haskell\Projects\Dev\TestFFI>dist\build\TestFFI\TestFFI.exe
[1,2,3,4,5,6]
[1,2,3,4,5,6]
[1,2,3,4,5,6]

这对我来说似乎没有任何意义。我第三次打印我期待的阵列:

[69128391783,2083719073,934857983457,98374293874,0239823947,2390847289347]

随机数据!

我做错了什么吗?我错过了什么吗?

最佳答案

在释放内存后读取内存是未定义的行为。任何事情都是允许的——包括返回随机数据、召唤鼻恶魔,甚至在最无聊的可能世界中,返回内存被释放之前的数据。

关于haskell - Haskell 的 FFI 上的函数 'free' 似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33267496/

相关文章:

linux - 未找到 FFI 错误模块

arrays - 如何从 C 指针创建 Racket 可变数组来修改 OpenCV 图像?

haskell - 'where' 中的类型声明——这是怎么回事?

haskell - 'no specified version' 在我的 Cabal 构建中意味着什么?

c - 如何将字符串从 Haskell 传递给 C?

c - 如何在 JavaScript 中保存指针并进一步检索

c# - 我应该如何释放在 Rust 中分配的 C# byte[]?

解析函数与Happy的应用

haskell - 不同种类的类型类约束

string - 遍历字节串