尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

C# 手動管理內存

C# 手動管理內存
📅 发布时间:2026/6/18 21:32:03

C# 手動管理內存

手動管理內存實驗

本實驗旨在理解 C# 中 unsafe 指標操作與 非託管記憶體(unmanaged memory) 的使用方法,並學會如何使用 NativeMemory.Alloc 分配記憶體、直接操作位元資料、以及使用 Encoding 將 byte 資料正確轉換為字串。

二、實驗環境

  1. 開發工具:JetBrains Rider / Visual Studio 2022
  2. .NET SDK:.NET 8.0
  3. 作業系統:Windows 11 / Linux / macOS
  4. 專案設定:
<PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net8.0</TargetFramework><AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

三、實驗程式碼

using System;
using System.Runtime.InteropServices;
using System.Text;unsafe
{// 分配 100 bytes 非託管記憶體void* ptr = NativeMemory.Alloc(100);try{byte* bytes = (byte*)ptr;// 將 ASCII 字元 '1', '2', '3' 寫入記憶體bytes[0] = (byte)'1';bytes[1] = (byte)'2';bytes[2] = (byte)'3';bytes[3] = (byte)'\0'; // C-style 字串結尾// 讀取前 3 bytes 並轉為字串string text = Encoding.ASCII.GetString(bytes, 3);Console.WriteLine($"輸出內容:{text}");}finally{// 釋放非託管記憶體,防止記憶體洩漏NativeMemory.Free(ptr);}
}

四、實驗步驟

  1. 在 .csproj 檔中啟用 true。
  2. 使用 NativeMemory.Alloc(100) 分配 100 bytes 非託管記憶體。
  3. 利用指標 byte* 對該記憶體位置直接操作,寫入字元 '1', '2', '3'。
  4. 透過 Encoding.ASCII.GetString() 將指定長度的 bytes 轉為字串。
  5. 輸出結果後,使用 NativeMemory.Free(ptr) 釋放記憶體。

五、實驗結果

執行後輸出:

輸出內容:123

六、結果分析

步驟 動作說明 結果
NativeMemory.Alloc(100) 分配 100 bytes 未受 GC 管理的空間 成功分配
bytes[0] = (byte)'1' 等 直接操作指標寫入資料 記憶體內容:31 32 33 00(十六進制)
Encoding.ASCII.GetString(bytes, 3) 將前 3 bytes 轉為字串 "123"
NativeMemory.Free(ptr) 手動釋放非託管記憶體 無洩漏

分析:

  • 若錯誤地使用 bytes->ToString(),則輸出 "49",因為那是 '1' 的 ASCII 數值。
  • 正確轉換方式是透過 Encoding 類別將 byte[] → string。
  • NativeMemory 提供比 Marshal.AllocHGlobal 更現代化的低階記憶體控制 API。
  • 此實驗說明了 unsafe 區塊允許開發者像 C 語言一樣直接控制記憶體。
  1. 本實驗展示了 C# 在 unsafe 環境中對非託管記憶體的操作能力。
  2. 使用 NativeMemory.Alloc 分配記憶體後,可直接透過指標寫入資料。
  3. 透過 Encoding.GetString() 可將指定的 bytes 區段轉換成字串。
  4. 雖然 unsafe 操作提供更高的效能與靈活度,但需開發者自行負責記憶體管理,
  5. 若未釋放記憶體或操作越界,將導致非託管記憶體洩漏或程式崩潰。

✅ 建議:除非在高效能或與原生程式碼互通時,否則應避免大量使用 unsafe。

相关新闻

  • C# 委託(Delegate)與事件(Event)筆記
  • 点特征 - MKT
  • 正弦化作用 - MKT

最新新闻

  • 面试被问“你的缺点是什么”,90%的应届生都答错了!(附满分话术)
  • Spring Cloud Alibaba 最佳实践:基于 Spring Boot 4.0 的完整微服务示例项目
  • 三步掌握AI斗地主:如何用DouZero智能助手提升你的游戏胜率
  • 2026山东大学项目实训个人博客(六)
  • DC/DC电源设计实战:从MIC261201选型到PCB布局与热管理全解析
  • 2026济南婚纱摄影选型全指南:行业标准、品牌梯队与合规避坑全解析 - 速递信息

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号