ZKX's LAB

c托管内存和非托管内存 在看GC这一块时看到托管对象和非托管对象,请问托管对象和非托管对象都有哪些?

2020-10-17知识13

c#中托管代码和非托管代码的区别! C#里都是托管,而且是他的专有名词,.NET中都是托管的环境非托管一般是C 或其他的语言写的,比如系统API的调用就是非托管[DLLImport(\"user32.dll\")]这个就是非托管。

托管代码和非托管代码有什么区别 广义的说,托管代码就是集成在你所使用的开发平台内的编程语言。例如:目前最常见的.Net 运行库里集成了VC+,C#,VB,F#.等20多种语言的构件和处理功能。托管代码:托管“的含义就是,这些语言的后台(隐性的)操作都由这个管理系统(.Net)完成了,你把你的编程委托给了开发平台(库)来完成。当你使用这些语言时,一些系统资源的调用、回收、编译…各种工作都由它来完成,你只需要专注于程序功能的实现即可。非托管代码:就是指不在你这个集成开发环境里,而是使用其它的开发平台写出的程序(代码)。比如说java语言(不是jscript),basic语言(不是VB),C语言(不是VC/C++/C#)等等…它们也有自己的开发平台和程序,用这些语言写出的程序就属于”非托管。当非托管的代码在你的托管平台上运行时,你的托管平台就不能很好地处理一些后台(隐性的)操作,就需要编写额外的代码来使它们变得和谐并且安全。举个最简单的例子:C和汇编语言,它们是最早期进入计算机领域的高级语言(汇编已经不能算高级语言了:)),它们可以直接对CPU、内存、总线、I/O、硬盘等硬件进行操作(读/写),像DOS、Windows、iOs这些操作系统都是用它们写的。所以你在.Net集成环境中直接使用这些。

C++/CLI 托管指针与非托管指针之间的转换 不太确定你想干什么。如果你单纯想把一个托管指针传给一个本地函数,那么应该用pin_ptr固定住这个托管对象,然后把pin_ptr变量转换成void*交给本地函数。类似于ManagedType^obj=gcnew ManagedType;pin_ptr^>;pin=obj;固定住obj,不让它在内存中位置发生变化。注意这个只在pin变量的生存期内有效。void*pobj=pin;CFunction(pobj);但是这样也只能传递一下而已,因为托管对象的指针在本地代码里是不能用的。除了在本地代码里临时保存托管对象给别的托管代码使用以外没什么意义。ManagedType^obj2=*(ManagedType^)pobj;可以这样在转换回去。不过说老实话这么干各种危险。所有这些必须在pin的生存期内干。如果你希望在C函数中直接使用托管类的对象。你大可让C函数直接接受托管对象。归根结底我还是不知道你要干什么。

.Net托管代码与非托管代码的区别是什么? Net中托管代码与非托管代码的区别如下:1、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;非托管代码需要自己提供安全检测、垃圾回收等操作。

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有一种特殊的语法,。

如何写一个托管和非托管下都能编译成功的C++结构体,方便在不同环境下调用? 托管与非托管混合编程部分这部分是最重要,也是最难的。VisualStudio环境提供了一些头文件来帮助开发者链接这些关键词。include但是,并非就到这儿就结束了。我们还需要小心涉及的一些陷阱,尤其是是CLR(托管代码)和native(非托管代码)一些关键词之间数据的传递。以下是个类的头文件输出一个托管的部分pragma onceifdef NATIVEDLL_EXPORTSdefine NATIVEDLL_API_declspec(dllexport)elsedefine NATIVEDLL_API_declspec(dllimport)endifincludeusing namespace std;ifdef_UNICODEtypedef wstring tstring;elsetypedef string tstring;endifclass NATIVEDLL_API CPerson{public:InitializationCPerson(LPCTSTR pszName,const SYSTEMTIME*birthDate);virtual~CPerson();Accessorsunsigned int get_Age()const;tstring get_BirthDateStr()const;SYSTEMTIME get_BirthDate()const;private:Embedded wrapper of an instance of a CLR classGoal:completely hide CLR to pure unmanaged C/C++ codevoid*m_pPersonClr;};强调一点,尽量在头文件里保证只有非托管代码,混合编程在cpp中去实现,数据的传递。比如:应该尽量避免使用vcclr.h中的函数,。

#指针变量#c++#托管代码#指针

随机阅读

qrcode
访问手机版