导读:本期聚焦于小伙伴创作的《C#如何使用NativeMemory分配非托管内存?本机内存分配方法有哪些》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C#如何使用NativeMemory分配非托管内存?本机内存分配方法有哪些》有用,将其分享出去将是对创作者最好的鼓励。

在C#开发中,除了托管堆内存之外,很多时候需要和底层系统交互或者追求更高的内存操作性能,这时候就需要使用非托管内存也就是本机内存。NativeMemory是.NET中专门用于分配和释放本机内存的类,提供了多种灵活的分配方式,避免了传统Marshal类操作非托管内存的繁琐步骤。

C#如何使用NativeMemory分配非托管内存?本机内存分配方法有哪些

NativeMemory常用分配方法

分配指定字节数的内存

最基础的方法是Alloc,它可以分配指定大小的本机内存,返回值是指向内存起始地址的void*指针。需要注意分配的内存不会初始化,里面是随机的垃圾数据。

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        // 分配100字节的本机内存
        int size = 100;
        void* ptr = NativeMemory.Alloc((nuint)size);
        
        try
        {
            // 使用内存的逻辑,比如写入数据
            // 注意需要手动处理指针操作,避免越界
        }
        finally
        {
            // 必须手动释放内存,否则会造成内存泄漏
            NativeMemory.Free(ptr);
        }
    }
}

分配对齐内存

如果需要分配指定对齐要求的本机内存,可以使用AlignedAlloc方法,它支持传入对齐参数,适合需要内存对齐的场景,比如SIMD指令操作或者和某些底层库交互的需求。

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        // 分配1024字节内存,内存地址按32字节对齐
        nuint size = 1024;
        nuint alignment = 32;
        void* alignedPtr = NativeMemory.AlignedAlloc(size, alignment);
        
        try
        {
            // 验证对齐是否符合要求
            nuint address = (nuint)alignedPtr;
            Console.WriteLine($"内存地址: {address}, 是否32字节对齐: {address % alignment == 0}");
        }
        finally
        {
            // 对齐内存必须使用对应的AlignedFree释放
            NativeMemory.AlignedFree(alignedPtr);
        }
    }
}

分配数组形式的本机内存

如果需要分配连续的多元素本机内存,类似数组的结构,可以使用AllocArray方法,它会计算元素数量乘以单个元素大小的总内存,并返回对应类型的指针。

using System;
using System.Runtime.InteropServices;

class Program
{
    static void Main()
    {
        // 分配10个int类型的本机内存数组
        int elementCount = 10;
        int* intArrayPtr = (int*)NativeMemory.AllocArray<int>((nuint)elementCount);
        
        try
        {
            // 给数组元素赋值
            for (int i = 0; i < elementCount; i++)
            {
                intArrayPtr[i] = i * 10;
            }
            // 读取验证数据
            for (int i = 0; i < elementCount; i++)
            {
                Console.WriteLine($"第{i}个元素: {intArrayPtr[i]}");
            }
        }
        finally
        {
            NativeMemory.Free(intArrayPtr);
        }
    }
}

使用NativeMemory的注意事项

  • 本机内存不受.NET垃圾回收管理,分配之后必须手动调用对应的释放方法,否则会造成内存泄漏,建议配合try-finally块使用确保释放逻辑执行。
  • 不同的分配方法必须对应对应的释放方法,AllocAllocArray分配的内存用Free释放,AlignedAlloc分配的内存必须用AlignedFree释放,混用会导致未定义行为。
  • 操作本机内存指针的时候要注意越界访问,本机内存没有托管内存的边界检查,越界写入可能会破坏其他内存数据,导致程序崩溃或者数据错误。
  • 如果需要将本机内存的数据转换为托管类型,需要使用Marshal类的相关方法,比如PtrToStringUTF8Copy等,避免直接转换导致类型错误。

和传统非托管内存操作方式的对比

在NativeMemory出现之前,C#操作非托管内存通常使用Marshal.AllocHGlobal或者Marshal.AllocCoTaskMem,和这些方法相比,NativeMemory的优势更明显:

对比项NativeMemoryMarshal.AllocHGlobal
内存对齐支持原生支持对齐分配不直接支持,需要手动计算偏移实现
数组分配便捷性提供AllocArray直接分配数组需要手动计算总大小再分配
内存释放对应性分配和释放方法分类清晰统一用Marshal.FreeHGlobal释放,容易混淆
使用本机内存的核心原则是按需分配、及时释放,同时要严格控制指针操作的边界,避免内存安全问题。NativeMemory提供了更贴合本机内存操作习惯的API,能简化很多非托管内存操作的流程。

NativeMemoryC#非托管内存本机内存分配修改时间:2026-06-30 18:33:44

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。