结构构造函数中的f#NativePtr.stackalloc

时间:2016-02-16 04:16:57

标签: struct f# unmanaged-memory

我正在做一些F#性能测试,我正在尝试在堆栈上创建一个数组而不是堆(值与引用类型)。我使用NativePtr.stackalloc在堆栈上分配内存。在下面的第一个构造函数中获取错误。

type StackArray<'T when 'T : unmanaged> =
    struct
        val pointer: nativeptr<'T>

        new(x) = { pointer = NativePtr.stackalloc x}
        new(pointer) = { pointer = pointer}
    end    

// This give a System.TypeInitializationException with internal System.InvalidProgramException   
let ints2 = new StackArray<int>(10) 

// This works fine
let (pointer:nativeptr<int>) = NativePtr.stackalloc 10
let ints = new StackArray<int>(pointer) 

我可以简单地在函数中使用第二种方法,但是为什么我不能在构造函数中分配内存真的很烦我。

1 个答案:

答案 0 :(得分:4)

如果在函数中使用stackalloc进行分配,一旦返回,分配的堆栈空间必须被释放(或者你不会有堆栈)

我原本以为在使用该对象时会发生错误,但错误立刻并不令人惊讶