我需要创建一个与64字节边界对齐的数组。我需要这样做,因为我正在调用一个使用AVX的DLL,它需要待对齐的数据。本质上,我需要在C#中这样做:
void* ptr = _aligned_malloc(64 * 1024, 64);
int8_t* memory_ptr = (int8_t*)ptr;我很确定我不能在C#中自然地为这样的边界创建一个数组。因此,一个选项是创建一个字节数组,这个数组是x+64 long,然后“创建”一个覆盖它的数组,但是在所需的边界上有一个偏移量。
问题是我如何做到这一点,而不存在内存泄漏?(内存泄漏是我不愿使用DLL来创建对数组的引用并将其传递给C#的原因。除非有好办法这样做?)
使用以下有用的答案,这就是我所拥有的,希望它能帮助到其他人:
public class Example : IDisposable
{
private ulong memory_ptr;
public unsafe Example()
{
memory_ptr = (ulong)NativeMemory.AlignedAlloc(0x10000, 64);
}
public unsafe Span<byte> Memory => new Span<byte>((void*)memory_ptr, 0x10000);
public unsafe void Dispose()
{
NativeMemory.Free((void*)memory_ptr);
}
}发布于 2022-08-07 18:34:10
为了避免内存泄漏,首先需要固定阵列。钉扎防止指向的对象在垃圾收集堆上移动。
有一个类似于您正在做的这里的例子。
但是,这个例子还不够深入,因为它只是引脚而不控制初始内存分配。若要防止内存泄漏,请使用GCHandle.Alloc与GCHandleType.Pinned。就像这。
https://stackoverflow.com/questions/73269625
复制相似问题