如何在C#中实现malloc操作

6
float **ThreadID;
int Nthreads;

如何在C#中执行以下任务?
ThreadID = (float **)malloc( Nthreads* sizeof(float *) );

6
在C#中,你不需要手动分配内存。 - user1479055
10
为什么你需要这样做呢?.NET运行时是一种托管运行时 - 你不需要管理自己的内存。 - Oded
2
如果有人想要更深入地控制内存分配怎么办?如果你在处理数据结构时能够拥有连续分配的内存,那么存储上就会有很大的优势。 - IKriKan
如果有人想更深入地控制内存分配,那怎么办?如果你能够拥有连续分配的内存,这将在处理数据结构时带来很大的存储优势。 - IKriKan
3个回答

6

你的应用程序是否有使用非托管内存的必要?如果没有,那么通常的做法是

ThreadID = new float*[Nthreads];

这将为您分配一个新的数组。如果您在经常调用的函数中使用此类语句,则可能需要添加stackalloc关键字,否则缓慢的垃圾收集可能会导致增加的内存消耗。使用stackalloc,它将存储在堆栈上,并在离开函数时像任何其他本地变量一样销毁。

ThreadID = stackalloc float*[Nthreads];

编辑:与C#中的所有指针一样,您需要为函数声明不安全上下文,例如

unsafe int doSomething(){
   ...
}

2
@RitchMelton:指出我的错误,点赞+1。 - Legionair
在使用ThreadID = new float*[Nthreads];时,会出现错误,提示“无法隐式转换类型'float* []'为'float **'”。 - user1561275

6
您可以尝试使用以下方法:
Marshal.AllocHGlobal 

可以在MSDN这里查看详细信息。


3
float[][] ThreadId;
int NThreads;

ThreadId = new float[Nthreads][];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接