【C#】托管和非托管

文章目录

托管(易管理)

1、托管代码是由.NET运行时(CLR,Common Language Runtime)管理和执行的代码。

2、托管代码使用CLR提供的垃圾回收器进行内存管理,自动回收不再使用的内存,并处理内存泄漏和悬挂指针等问题。

3、C#、VB.NET、F#等.NET语言编写的代码都是托管代码。

4、托管代码在执行时受到CLR的严格控制,可以提供更高的安全性和可靠性。

非托管(高性能)

非托管代码是不受CLR控制和管理的原生代码,通常是由C或C++等语言编写的。

非托管代码直接操作系统资源和内存,需要手动管理内存分配和释放。

通常情况下,非托管代码执行速度更快,但也更容易导致内存泄漏、悬挂指针和安全漏洞等问题。

不能在析构函数中释放托管资源,因为析构函数是有垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。

示例

1、托管代码示例(C#)

csharp 复制代码
int x = 10;
string y = "Hello World";
// 自动垃圾回收,类型安全等
AI写代码

2、非托管代码示例(C++)

csharp 复制代码
int x = 10;
char* y = new char[12];
strcpy(y, "Hello World");
// 需要手动管理内存
delete[] y;

GC场景

(1)系统具有低的物理内存。 这是通过 OS 的内存不足通知或主机指示的内存不足检测出来。

(2)由托管堆上已分配的对象使用的内存超出了可接受的阈值。 随着进程的运行,此阈值会不断地进行调整。

(3)调用 GC.Collect 方法。 几乎在所有情况下,你都不必调用此方法,因为垃圾回收器会持续运行。 此方法主要用于特殊情况和测试。

来源

[C#] 托管与非托管
什么是托管资源,什么是非托管资源

相关推荐
青草地溪水旁21 分钟前
设计模式(C++)详解——迭代器模式(2)
java·c++·设计模式·迭代器模式
9号达人23 分钟前
Java18 新特性详解与实践
java·后端·面试
我不是混子29 分钟前
java浮点数精度问题及解决方案
java·后端
Aevget36 分钟前
界面控件DevExpress WinForms v25.1 - AI聊天控件功能持续增强
c#·界面控件·winform·devexpress·ui开发
csdn_aspnet42 分钟前
在 C# .NETCore 中使用 MongoDB(第 2 部分):使用过滤子句检索文档
mongodb·c#·.netcore
花心蝴蝶.1 小时前
Java 中的代理模式
java·开发语言·代理模式
舒克起飞了1 小时前
设计模式——单例模式
java·单例模式·设计模式
大飞pkz1 小时前
【设计模式】享元模式
开发语言·设计模式·c#·享元模式
Java&Develop1 小时前
GitLab-如何基于现有项目仓库,复制出新的项目仓库
java
一只乔哇噻1 小时前
java后端工程师进修ing(研一版‖day49)
java·开发语言