问题描述
ImportsSystem.Runtime.InteropServicesModuleModule1'//注意这个属性不能少:允许您控制类或结构的数据字段的物理布局。'//指示可序列化'//按1字节对齐<Serializable()>_<StructLayout(LayoutKind.Sequential,Pack:=1)>_PublicStructure_OperatorDimidAsUShort'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar<MarshalAs(UnmanagedType.ByValArray,SizeConst:=9)>_Dimpass()AsChar' publicchar[]pass;PublicSharedFunctionCreateInstance(ByValuserIDAsUShort,ByValuserNameAsString,ByValpasswordAsString)As_OperatorDimresultAsNew_Operatorresult.id=userIDresult.name=userName.ToArray()result.pass=password.ToArray()ReturnresultEndFunctionPublicSharedFunctionDestroyInstance(ByValuserIDAsUShort,ByValuserNameAsString,ByValpasswordAsString)As_Operator'如何销毁非托管成员?EndFunctionEndStructureEndModule
从C#抄来的代码,有如下问题不明:问题1:结构体中的非托管成员是否需要销毁?在过程中生成结构体实例,过程调用完成后,结构体中的非托管成员是否会自行销毁?问题2:如果要销毁非托管成员,如何写销毁的代码?成员=nothing?
解决方案
解决方案二:
请你先解释一下,什么叫做“销毁”?如果你说是释放内存空间,那么你什么也不用做,GC自然就会释放。可惜,真正的“销毁”根本不是释放空间这个意思。是有些人在误导。
解决方案三:
引用1楼sp1234的回复:
请你先解释一下,什么叫做“销毁”?如果你说是释放内存空间,那么你什么也不用做,GC自然就会释放。
就是清除使用过的内存空间,并将之释放,供别的程序使用。由于使用的是非托管的数据类型,担心GC管不到。我的代码有大量的包函非托管的数据类型的结构体,用来传送Socket数据,现在出现不明原因的崩溃,所以怀疑是这个原因导致内存泄漏。引用1楼sp1234的回复:
可惜,真正的“销毁”根本不是释放空间这个意思。是有些人在误导。
对于这些别有用心的人,我代表广东人民表示:“呵呵!”
解决方案四:
非托管资源需要销毁.GC不管的。不建议在struct中加入非托管资源的成员,建议使用class.正统销毁非托管资源的方法是实现IDispose接口,然后用到class的地方使用using。下面的msdn页面有使用和实现IDispose接口的例子和解释:IDisposableInterface
解决方案五:
你的结构不涉及非托管资源,销毁也无从谈起
解决方案六:
引用3楼findcaiyzh的回复:
非托管资源需要销毁.GC不管的。不建议在struct中加入非托管资源的成员,建议使用class.正统销毁非托管资源的方法是实现IDispose接口,然后用到class的地方使用using。下面的msdn页面有使用和实现IDispose接口的例子和解释:IDisposableInterface
由于是从VB6(古董啊)移植过来的程序,原先就进结构体,不想改动太大。@宝_爸,能否有个妥善的解决方法?
解决方案七:
引用4楼iyomumx的回复:
你的结构不涉及非托管资源,销毁也无从谈起
'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。
解决方案八:
引用6楼loakia5的回复:
Quote: 引用4楼iyomumx的回复:
你的结构不涉及非托管资源,销毁也无从谈起'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。
这是托管数组,纯的。只有在封送给非托管代码的时候它才会被复制到一个临时的内存空间中成为结构的一部分。
解决方案九:
引用6楼loakia5的回复:
Quote: 引用4楼iyomumx的回复:
你的结构不涉及非托管资源,销毁也无从谈起'//声明一个字符数组,大小为11<MarshalAs(UnmanagedType.ByValArray,SizeConst:=11)>_Dimname()AsChar这个是一个非托管数组。
这个不是非托管,只有传给unmanagedcode是才转换成非托管数组。这个GC会管的。