ZKX's LAB

c 托管内存非托管 托管代码与非托管代码的区别

2020-07-20知识12

在看GC这一块时看到托管对象和非托管对象,请问托管对象和非托管对象都有哪些? 你好,简单的说,在dotNet端分配的内存都是托管的,但是需要注意Image,Font,Brush等对象,通常这些对象都很占内存,一个Image对象就可能上百兆,我们在使用这些对象的时候,建议手动回收。另外,如果不是dotNet分配的内存,就都该属于非托管的了,比如C++分配的内存。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函数直接接受托管对象。归根结底我还是不知道你要干什么。c#中托管代码和非托管代码的区别! C#里都是托管,而且是他的专有名词,.NET中都是托管的环境非托管一般是C 或其他的语言写的,比如系统API的调用就是非托管[DLLImport(\"user32.dll\")]这个就是非托管。托管代码与非托管代码的区别 其实整个.NET项目都是运行在.NET Framework上的托管代码,这个道理和JAVA虚拟机的机制是类似的。最简单的说呢,受托管的代码不能直接写内存,是安全的,而非托管代码是非安全代码,可以使用指针操作内存。一般的项目使用托管代码都行了,也就是说在程序里面不需要用到非安全代码。对于一些对速度要求高的部分功能可以考虑使用非安全代码,使用指针等读写内存,而对于真个项目来说还是受托管的安全代码。有关非安全代码的信息请查阅MSDN unsafe。

#托管代码#c++#托管

随机阅读

qrcode
访问手机版