簡體   English   中英

Haskell的FFI上的'free'功能似乎不起作用

[英]function 'free' on Haskell's FFI doesn't seem to work

我正在努力熟悉Haskell的FFI,所以我寫了這個小例子:

Main.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

test.h

#ifndef TEST_H
#define TEST_H

int* test(int a);

#endif

test.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]

隨機數據!

難道我做錯了什么? 我錯過了什么嗎?

在釋放內存后讀取內存是未定義的行為。 任何事情都是允許的 - 包括返回隨機數據,召喚鼻子惡魔,甚至在可能的世界中,在釋放之前返回該內存中的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM