ZKX's LAB

托管内存与非托管

2020-07-16知识18
托管和非托管的c++是什么意思,有什么区别? 所谓托管是指内存管理由系统而不是由程序员管理。像C#这样的语言的内存管理(内存的分配和释放)都是由系统管理的。所以只有new而没有delete。C++有个很重要的特点就是内存由程序员管理。所以分配内存以后,要程序员自己释放。如果没有释放就会有内存泄露,如果在不该释放时释放了,就会出现所谓的野指针。在C++把内存管理交给系统的,由系统来负责释放,就被称为托管。托管C++是微软所创造一种扩展C++的一种叫法。英文写出来是Managed C++,就更能看出宣传有系统管理内存这个意思。其实这可以看出微软的一个噱头。尽管在当时引起了很多人的兴趣,但多数对所谓的Managed C++不满意。所以后来微软推出了C++/CLI,相对Managed C++对标准的C++做了很多更激进的改造。当然C++/CLI依然有系统(准确的说是.net框架)管理内存功能,所以也有人把C++/CLI依然称为托管C++。说道区别,你可以简单的把托管C++看成在语言层次上支持.net框架。但严格的说没有非托管C++,因为托管只是一种对C++的扩展。使用标准C++理论上说也可以支持.net框架。就像支持其他系统一样。不使用.net框架,也C++可以利用别的办法由系统来管理内存。区别主要在语言层次上,以C++/CLI为例: C++/CLI有一种特殊... 什么是托管、非托管?? 托管和非托管是什么意思 它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据... 如何让IntPtr指向一块内存,以及托管内存与非托管内存的相互转化 托管是。NET的一个专门概念,它是融于通用语言运行时(CLR)中的一种新的编程理念,因此我们完全可以把“托管”视为。NET”。那么什么是“通用语言运行时”?通用语言运行时是。NET 框架应用程序的执行引挚。它提供了许多服务,其中包括:代码管理(装入和执行)、类型安全性验证、元数据(高级类型信息)访问、为管理对象管理内存、管理代码,COM对象和预生成的DLLs(非管理代码和数据)的交互操作性、对开发人员服务的支持等等。也就是说,使用托管C++意味着,我们的代码可以被CLR所管理,并能开发出具有最新特性如垃圾自动收集、程序间相互访问等的。NET框架应用程序。 C#和C++ 关于托管与非托管的问题 C#是内存托管的,你new出来的对象C#系统还会自动创建一个系统指针指向它,如果你创建的指针都被销毁了,.NET系统就会自动利用系统指针将空间销毁掉,这个就是垃圾回收的原理,你new出来的对象用完后可以不用再管它,反正系统会解决一切,不过你也可以通过调用对象的Dispose方法来手动销毁,托管不托管与语言有关,而非使用方法,就好比坏人做了一件好事了那他就不再是坏人了么?C++是非托管的,new出来的对象需要自己手动销毁,否则会内存泄露,C++销毁内存用delete,delete是一个语句运算符,不是函数,你还可以重载delete运算符,不过在C++中delete数组需要用delete[]来删除 托管代码与非托管代码的区别 其实整个.NET项目都是运行在.NET Framework上的托管代码,这个道理和JAVA虚拟机的机制是类似的。最简单的说呢,受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。一般的项目使用托管代码都行了,也就是说在程序里面不需要用到非安全代码。对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于真个项目来说还是受托管的安全代码。有关非安全代码的信息请查阅MSDN unsafe。 C#中提到的非托管的dll和托管的dll,两者有什么不同吗? 托管DLL,说白了,就是 完全由.NET托管代码实现的DLL,完全依赖于.NET 平台的 CLR 运行。托管DLL,受.NET CLR管控,支持内存自动回收等的,对于.NET平台是安全DLL 非托管DLL,是指完全或者部分 不是用.NET代码实现,不依赖于.NET平台即可运行,例如COM方式 的DLL,不支持自动回收内存,对于.NET平台而言,也是非安全可控的。 csharp 托管与非托管的区别,小弟先谢过了。 C#运行在虚拟机之中,但是虚抄拟机中的代码可能需要和外部交互,例如以前的C/C++开发的DLL的API,需要直接访问内存(或者说直接操作指针),或者需要将C#内部的内存传递给外部的API使用,这些操作在正常的情况下是不允许的(这被C#标记为unsafe的),那些包含管控(unsafe)的代码是就是非托管知代码;反之是safe的代码,是托管的代码。简单的理解,系统层面可以是unsafe,其他的是safe。托管代码可移植性好,对宿主道和外部没依赖,只依赖虚拟机。 托管代码与非托管代码的区别 1简单的说,就是代码被编译成MSIL后在.net的Framework下运行,同操作系统底层的交互都交给framework去做。所谓非托管代码就是脱离了Framework的管制,直接同底层API打交道,自己管理自己的内存和安全机制等东西。而托管代码就不管这些,全都由Framework去完成 2“程序”一般都是在对操作系统进行直接或者间接的操作 “托管程序”是需要通过访问公共语言运行时(cls)才能访问操作系统的程序而“非托管程序”不用通过访问公共语言运行时(cls)可以直接访问操作系统的程序 3vb.net,C#等写的程序是托管程序,VC+可以写托管程序,如果用到了内存管理,则只能编译为非托管程序这些东西MSDN上都写得很清楚的,如果真想深入了解的话LZ可以看看CLR via C#、.net框架设计、Effective C#之类的书籍 .Net托管代码与非托管代码的区别是什么? Net中托管代码与非托管代码的区别如下: 1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。

#delete#c++#托管代码#代码管理#托管

随机阅读

qrcode
访问手机版